使用GPUImage重新创buildiOS 7 Glass效果

我试图通过将图像效果应用于MKMapView的屏幕截图来使用我的玻璃杯中的iOS 7样式玻璃效果。 Apple提供的这个UIImage类别是我用作基线的。 该方法使源图像去饱和,应用色调颜色,并使用input值重度模糊:

 [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]; 

这产生了我正在寻找的效果,但是时间太长了.5秒之间在iPhone 4上渲染。

在这里输入图像说明

我想使用优秀的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在另一个SO问题中提出的意见设置filter。 我是否使用错误的GPUImagefilter来重现这种效果,或者我只是设置错误?

好的,我在这里工作了一段时间,终于有了function。 我只是将GPUImage的模糊filter进行了一些更改,并将其作为结果,我相信我有一个苹果模糊效果的合理副本,用于像控制中心视图之类的东西。

以前,我在框架中使用的模糊使用了一个预先计算的半径,而影响其强度的唯一方法是调整从input图像中采样像素的间距。 在每个像素采样数量有限的情况下,如果采样像素之间的间隔的倍数大于1.5,那么随着像素被跳过,开始引入严重的块效应。

我已经构build的新的高斯模糊实现结合了预先计算的高斯权重的性能优势和对高斯模糊使用任意半径(西格玛)的能力。 它通过随时生成着色器来满足各种半径需求。 它还通过使用硬件插值为每个采样点一次读取两个纹理元素来减less给定模糊半径所需的纹理采样的数量。

新的GPUImageiOSBlurFilter将这个经过调整的任意半径高斯模糊滤波器与一个颜色校正滤波器结合在一起,该滤波器似乎可以复制Apple在模糊后对颜色进行的调整。 我在这里添加了下面的比较来回答我的问题,但是它显示了苹果公司从左侧的控制中心视图中内置的模糊,以及右侧的新的GPUImage模糊filter:

苹果的模糊GPUImage的模糊

作为提高性能的一种方法(苹果的模糊似乎发生在48的sigma,这需要相当大的面积,每个像素采样),我使用4倍下降采样之前的高斯模糊,然后4倍上采样之后。 这样可以减less需要16X模糊的像素数量,同时也可以将模糊sigma从48减less到12点。iPhone 4S可以使用此滤镜在大约30 ms内模糊整个屏幕。

正确的模糊是一回事。 苹果公司仍然没有提供一种快速获取图片内容的快速方法,因此很有可能成为您快速改变内容的瓶颈。