GPUImage: 更暗的iOS 7模糊效果
GPUImage: 更暗的iOS 7模糊效果
我需要一种可靠高效的方法来创建iOS 7的模糊效果。我已经实现了苹果的applyBlurWithRadius
,来自WWDC代码(UIImage+ImageEffects)
。它其实非常灵活,还允许改变tintColor
,以创建更深的模糊效果,就像这样:
但它依赖于核心图形,这会降低表格视图的滚动性能。然后我看到了BradLarson的GPUImage库,它的GPUImageiOSBlurFilter
方法可以复制iOS 7的效果,并且比UIImage+ImageEffects
快得多,所以在我的情况下似乎更可用。
但问题是,它没有像tintColor
这样的参数。它创建了一个白色的效果像这里。此外,GPUImage还有其他滤镜,但我不确定是否能够得到我想要的效果。
问题的原因是由于在GPUImageiOSBlur滤镜的最后一步中应用了亮度范围限制,导致出现了“变白”的效果。这最后一步是使用GPUImageLuminanceRangeFilter来完成的,这个滤镜是为了复制苹果似乎应用于大多数叠加模糊效果的确切效果而构建的。然而,苹果在其他地方似乎使用了不同的颜色效果,所以为了模拟这种效果,需要改变滤镜的最后一步。
解决方法是可以基于GPUImageiOSBlurFilter和GPUImageLuminanceRangeFilter创建自定义滤镜,并改变GPUImageLuminanceRangeFilter的实现以使最终颜色比通常提供的更暗。需要通过实验来调整片段着色器中的值,以获得所需的效果。
其他人已经做过这样的尝试,并且效果不错,但是还没有将其作为拉取请求反馈回来。
下面是实现这个解决方法的示例代码:
// 创建自定义滤镜
GPUImageiOSBlurFilter *customBlurFilter = [[GPUImageiOSBlurFilter alloc] init];
GPUImageLuminanceRangeFilter *customLuminanceRangeFilter = [[GPUImageLuminanceRangeFilter alloc] init];
// 改变最后一步滤镜的实现
[customLuminanceRangeFilter setBlueMin:0.0 max:0.5];
[customLuminanceRangeFilter setRedMin:0.0 max:0.5];
[customLuminanceRangeFilter setGreenMin:0.0 max:0.5];
// 将自定义滤镜添加到滤镜链中
[customBlurFilter addTarget:customLuminanceRangeFilter];
// 处理输入图像
UIImage *inputImage = [UIImage imageNamed:@"inputImage.jpg"];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
[stillImageSource addTarget:customBlurFilter];
[stillImageSource processImage];
// 获取输出图像
UIImage *outputImage = [customLuminanceRangeFilter imageFromCurrentFramebuffer];