在边界外部模糊UIImage(类似于Photoshop)

8
我试图对一张UIImage进行高斯模糊,以达到与我的Photoshop模型设计相同的效果。
期望行为: 在Photoshop中,当我执行高斯模糊滤镜时,图像层由于模糊边缘而变大。
实际行为: 使用GPUImage,我成功地使我的UIImage变模糊。然而,新图像被裁剪在原始边界处,周围留下了一个硬边缘。将UIImageView.layer.masksToBounds = NO;设为false并不能解决问题,因为图片被裁剪的是图片而不是视图。
我还尝试在模糊之前将UIImage置于更大的透明图片的中心,然后再调整大小,但这也没有帮助。
有没有办法实现这种“Photoshop风格”的模糊效果?
更新的有效方法如下:感谢Brad Larson。
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];

当你“尝试在模糊之前将UIImage居中放置在一个较大的透明图像上”时,是否意味着你将原始图像合并到一个较大的UIImage中,使其成为一幅图像?如果是这样,请尝试使用白色图像代替透明图像,并确保白色图像具有alpha通道。我怀疑透明图像没有alpha通道,因此结果看起来被剪切了。 - bobnoble
2个回答

8

GPUImage仅会生成经过图像限制处理的结果。为了扩展图像范围,您需要扩展其操作画布。

为此,您需要将图像输入GPUImageTransformFilter,然后使用-forceProcessingAtSize:-forceProcessingAtSizeRespectingAspectRatio:来扩大工作区域。但是,这也会默认放大图像,因此要使用缩放变换和GPUImageTransformFilter来相对于更大的区域缩小图像大小。这将保持相同的像素尺寸,同时将其置于更大的整体图像内。

然后,您只需要将此输出送入模糊滤镜中,模糊现在将超出原始图像的边缘。您强制图像的大小取决于模糊需要超出原始图像边缘的程度。


1
谢谢Brad!这正是我所需要的!我会更新我的答案,提供可供参考的工作代码。 - 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); 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接