2013-10-14 25 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);