[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过滤器来重现这种效果,还是我只是设置它们错误?
解决方法
以前,我在框架中使用的模糊使用单个预先计算的半径,影响其强度的唯一方法是调整从输入图像采样像素的间距.对于每像素有限数量的样本,将采样像素之间的间距更改为大于1.5以上时会开始引入严重的块伪影,因为像素被跳过.
我所建立的新的高斯模糊实现结合了预先计算的高斯权重的性能优势以及对高斯模糊使用任意半径(sigma)的能力.它可以通过生成各种半径需要的着色器来实现.它还通过使用硬件内插来为每个采样点一次读取两个纹素来减少给定模糊半径所需的纹理样本数.
新的GPUImageiOSBlurFilter将这种调谐的任意半径高斯模糊滤镜与色彩校正滤镜相结合,该滤镜似乎可以复制Apple在模糊后对颜色进行调整.我将下面的比较添加到我的答案here,但它显示了从左边的控制中心视图的苹果内置模糊,右边是我的新的GPUImage模糊滤镜:
作为提高性能的一种方法(苹果的模糊似乎以48的Sigma标准出现,这需要为每个像素采样相当大的面积),我在高斯模糊之前使用4X下采样,然后在之后进行4X上采样.这样可以减少16X需要模糊的像素数量,并将模糊西格玛从48降低到12. iPhone 4S可以使用此滤镜在大约30 ms内模糊整个屏幕.