2013-10-14 26 views
7

我試圖在複製我的photoshop模型的UIImage上做高斯模糊。模糊界限之外的UIImage(Photoshop風格)

希望的行爲: 在Photoshop中,當我運行高斯模糊濾鏡時,由於邊緣模糊,圖像層變大。

觀察到的行爲:使用GPUImage,我可以成功地模糊我的UIImages。但是,新圖像在原始邊界處裁剪,從而留下了一個硬邊緣。

設置UIImageView.layer.masksToBounds = NO;沒有幫助,因爲圖像被裁剪而不是視圖。

我也嘗試將UIImage放在較大的清晰圖像上,然後調整大小。這也沒有幫助。

有沒有辦法實現這種「Photoshop風格」模糊?

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放在一個更大的清晰圖像中心模糊」之前,你的意思是你將原始圖像合併成一個更大的UIImage,所以它是一個圖像?如果是這樣,請嘗試使用白色圖像而不是清晰圖像,並確保白色圖像具有Alpha通道。我懷疑清晰的圖像沒有字母,因此結果看起來很剪輯。 – bobnoble

回答

7

GPUImage只會產生一個處理到圖像極限的結果。爲了擴展您的圖片,您需要展開它所在的畫布。

爲此,您需要將圖像輸入GPUImageTransformFilter,然後使用-forceProcessingAtSize:-forceProcessingAtSizeRespectingAspectRatio:來放大工作區域。但是,這也會默認放大圖像,所以爲了反擊這個問題,請使用GPUImageTransformFilter的縮放比例來縮小圖像相對於較大區域的大小。這將保持相同的像素尺寸,同時將其放置在更大的整體圖像中。

然後,您只需將此輸出提供給模糊濾鏡,模糊現在將延伸到原始圖像的邊緣。強制圖像的大小將取決於模糊需要延伸到原始圖像邊緣的距離。

+1

謝謝布拉德!這正是我需要的!我會更新我的答案與工作代碼供人們參考。 – nighthawk454

1

嘗試調整大小的UIImageView的邊界調整到模糊。一個視圖將會限制界限之外的內容。請注意,在您的示例中,Photoshop中模糊的框看起來比原始圖像大約大20%。

UIImageView *image; 
image.layer.bounds = CGRectMake(0, 
           0, 
           image.layer.bounds.size.width + 5, 
           image.layer.bounds.size.height + 5);