2013-10-14 9 views
7

मैं यूआईएममेज पर गॉसियन ब्लर करने की कोशिश कर रहा हूं जो मेरे फ़ोटोशॉप मैक अप को दोहराता है।सीमाओं के बाहर ब्लर यूआईएममेज (फ़ोटोशॉप-स्टाइल)

वांछित व्यवहार: फ़ोटोशॉप में, जब मैं एक गाऊसी कलंक फिल्टर चलाने के लिए, छवि परत धुंधला किनारों का एक परिणाम के रूप में बड़ा हो जाता है।

पर्यवेक्षित व्यवहार: GPUImage का उपयोग करके, मैं सफलतापूर्वक अपने UIImages को धुंधला कर सकता हूं। हालांकि, नई छवि मूल सीमाओं पर फसल की जाती है, जिससे चारों ओर एक कठिन किनारा निकलता है।

UIImageView.layer.masksToBounds = NO; सेट करने में मदद नहीं करता है, क्योंकि छवि दृश्य नहीं है।

मैंने धुंधला होने से पहले एक बड़ी स्पष्ट छवि पर केंद्रित UIImage को रखने का प्रयास किया है, और फिर आकार बदल रहा है। यह भी मदद नहीं की।

क्या इस "फ़ोटोशॉप-शैली" धुंध को हासिल करने का कोई तरीका है?

enter image description here

अद्यतन कार्य समाधान ब्रैड लार्सन को धन्यवाद:

UIImage sourceImage = ... 
GPUImagePicture *imageSource = [[GPUImagePicture alloc] initWithImage:sourceImage]; 
GPUImageTransformFilter *transformFilter = [GPUImageTransformFilter new]; 
GPUImageFastBlurFilter *blurFilter = [GPUImageFastBlurFilter new]; 

//Force processing at scale factor 1.4 and affine scale with scale factor 1/1.4 = 0.7 
[transformFilter forceProcessingAtSize:CGSizeMake(SOURCE_WIDTH * 1.4, SOURCE_WIDTH * 1.4)]; 
[transformFilter setAffineTransform:CGAffineTransformMakeScale(0.7, 0.7)]; 

//Setup desired blur filter   
[blurFilter setBlurSize:3.0f]; 
[blurFilter setBlurPasses:20]; 

//Chain Image->Transform->Blur->Output   
[imageSource addTarget:transformFilter]; 
[transformFilter addTarget:blurFilter]; 
[imageSource processImage]; 

UIImage *blurredImage = [blurFilter imageFromCurrentlyProcessedOutputWithOrientation:UIImageOrientationUp]; 
+0

जब आपने "धुंधला होने से पहले एक बड़ी स्पष्ट छवि पर केंद्रित यूआईएममेज को रखने का प्रयास किया", तो क्या आपका मतलब है कि आपने मूल छवि को एक बड़े UIImage में विलय कर दिया है, तो यह एक छवि है? यदि ऐसा है, तो स्पष्ट छवि के बजाय एक सफेद छवि का उपयोग करने का प्रयास करें, और सुनिश्चित करें कि सफेद छवि में अल्फा चैनल है। मुझे संदेह है कि स्पष्ट छवि में कोई अल्फा नहीं है, और इस प्रकार परिणाम फिसल जाता है। – bobnoble

उत्तर

7

GPUImage केवल एक परिणाम है कि आपकी छवि की सीमा से ऊपर संसाधित किया जाता है का उत्पादन करेगा। अपनी छवि को विस्तारित करने के लिए, आपको उस कैनवास का विस्तार करना होगा जिस पर यह चल रहा है।

ऐसा करने के लिए, आप अपनी छवि को GPUImageTransformFilter में फ़ीड करना चाहते हैं, फिर कार्य क्षेत्र को बड़ा करने के लिए -forceProcessingAtSize: या -forceProcessingAtSizeRespectingAspectRatio: का उपयोग करें। हालांकि, यह डिफ़ॉल्ट रूप से छवि को भी बढ़ाएगा, इसलिए इसका मुकाबला करने के लिए, बड़े क्षेत्र के सापेक्ष आपकी छवि के आकार को कम करने के लिए अपने GPUImageTransformFilter के साथ स्केल ट्रांसफॉर्म का उपयोग करें। यह इसे एक समान पिक्सेल आयामों के साथ रखेगा, जबकि इसे एक बड़ी समग्र छवि में रखेगा।

तो आपको बस इतना करना है कि इस आउटपुट को अपने धुंध फ़िल्टर में खिलाएं और धुंध अब आपकी मूल छवि के किनारे से आगे बढ़ेगा। जिस आकार को आप छवि को मजबूर करते हैं, उस पर निर्भर करेगा कि मूल छवि के किनारों के पीछे धुंध को कितना दूर करने की आवश्यकता है।

+1

धन्यवाद ब्रैड! मुझे ठीक इसी की आवश्यकता थी! मैं संदर्भ के लिए लोगों के लिए कामकाजी कोड के साथ अपना जवाब अपडेट करूंगा। – nighthawk454

1

UIImageView की सीमा का आकार बदलने के कलंक को समायोजित करने की कोशिश करो। एक दृश्य क्लिप को अपनी सीमाओं के बाहर क्या क्लिप करेगा। ध्यान दें कि आपके उदाहरण में, फ़ोटोशॉप में धुंधला बॉक्स मूल छवि की तुलना में लगभग 20% बड़ा दिखता है।

UIImageView *image; 
image.layer.bounds = CGRectMake(0, 
           0, 
           image.layer.bounds.size.width + 5, 
           image.layer.bounds.size.height + 5); 
संबंधित मुद्दे