使用GPUImage重新创建iOS 7玻璃效果

我试图在我的玻璃杯中使用iOS 7风格的玻璃效果,将图像效果应用于MKMapView的屏幕截图. This UIImage category,由苹果提供,是我用作基准.该方法使源图像饱和,应用色彩,并使用输入值大量模糊:
[image applyBlurWithRadius:10.0
                 tintColor:[UIColor colorWithRed:229/255.0f green:246/255.0f blue:255/255.0f alpha:0.33] 
     saturationDeltaFactor:0.66
                 maskImage:nil];

这产生了我正在寻找的效果,但需要太长时间 – 在iPhone 4之间渲染时间为.3和.5秒.

我想使用优秀的GPUImage,因为我的初步尝试速度已经快了约5-10倍,但是我似乎无法理解.

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:image];

GPUImageSaturationFilter *saturationFilter = [[GPUImageSaturationFilter alloc] init];
saturationFilter.saturation = 0.33; // 1.0 - 0.66;
[stillImageSource addTarget:saturationFilter];

GPUImageMonochromeFilter *monochromeFilter = [[GPUImageMonochromeFilter alloc] init];
[monochromeFilter setColor:(GPUVector4){229/255.0f,246/255.0f,1.0f,0.33f}];
[monochromeFilter setIntensity:0.2];
[saturationFilter addTarget:monochromeFilter];

GPUImageFastBlurFilter *blurFilter = [[GPUImageFastBlurFilter alloc] init];
blurFilter.blurSize = 2;
blurFilter.blurPasses = 3;
[monochromeFilter addTarget:blurFilter];

[saturationFilter prepareForImageCapture];
[monochromeFilter prepareForImageCapture];

[stillImageSource processImage];
image = [blurFilter imageFromCurrentlyProcessedOutput];

这产生一个接近但不完整的图像

模糊似乎不够深入,但是当我尝试增加上面的blurSize时,它变成网格,就像一个万花筒.您可以通过放大第二个图像来实际看到网格.我试图模仿的色调似乎只是洗出图像,而不是覆盖和混合,我认为苹果样品在做.

我已经尝试根据@BradLarson在another SO question的评论设置过滤器.我使用错误的GPUImage过滤器来重现这种效果,还是我只是设置它们错误?

解决方法

好的,我一直在这里工作一段时间,我终于有了它的功能.我刚刚将GPUImage的模糊过滤器的一些变化转化为框架,结果我相信我有一个合理的苹果模糊效果的复制品,它们用于控制中心视图.

以前,我在框架中使用的模糊使用单个预先计算的半径,影响其强度的唯一方法是调整从输入图像采样像素的间距.对于每像素有限数量的样本,将采样像素之间的间距更改为大于1.5以上时会开始引入严重的块伪影,因为像素被跳过.

我所建立的新的高斯模糊实现结合了预先计算的高斯权重的性能优势以及对高斯模糊使用任意半径(sigma)的能力.它可以通过生成各种半径需要的着色器来实现.它还通过使用硬件内插来为每个采样点一次读取两个纹素来减少给定模糊半径所需的纹理样本数.

新的GPUImageiOSBlurFilter将这种调谐的任意半径高斯模糊滤镜与色彩校正滤镜相结合,该滤镜似乎可以复制Apple在模糊后对颜色进行调整.我将下面的比较添加到我的答案here,但它显示了从左边的控制中心视图的苹果内置模糊,右边是我的新的GPUImage模糊滤镜:

作为提高性能的一种方法(苹果的模糊似乎以48的Sigma标准出现,这需要为每个像素采样相当大的面积),我在高斯模糊之前使用4X下采样,然后在之后进行4X上采样.这样可以减少16X需要模糊的像素数量,并将模糊西格玛从48降低到12. iPhone 4S可以使用此滤镜在大约30 ms内模糊整个屏幕.

让模糊正确是一回事.苹果仍然没有提供快速的方式将图像内容放在您的观点之后,因此很有可能是您在这里快速变化的内容的瓶颈.

以上是来客网为你收集整理的使用GPUImage重新创建iOS 7玻璃效果全部内容,希望文章能够帮你解决使用GPUImage重新创建iOS 7玻璃效果所遇到的程序开发问题。

如果觉得来客网网站内容还不错,欢迎将来客网网站推荐给程序员好友。