首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用GPUImage重新创建iOS 7玻璃特效

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

Stack Overflow用户
提问于 2013-08-23 22:08:43
回答 1查看 13.1K关注 0票数 12

我正试图在我的眼镜中使用iOS 7风格的玻璃效果,方法是将图像效果应用到MKMapView的屏幕截图上。苹果公司提供的This UIImage category是我使用的基准。此方法去掉源图像的饱和度,应用色调颜色,并使用输入颜色进行大量模糊:

代码语言:javascript
运行
复制
[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倍,但我似乎就是做不对。

代码语言:javascript
运行
复制
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时,它变得像网格一样,几乎就像万花筒一样。通过放大第二张图像,您可以在这里实际看到网格。我试图模仿的色调似乎只是洗掉了图像,而不是我认为Apple示例正在做的叠加和混合。

我试着根据@BradLarson在another SO question上的评论来设置过滤器。我是否使用了错误的GPUImage过滤器来重现这种效果,或者我只是错误地设置了它们?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-20 06:29:58

好的,我已经在这里做了一段时间了,我终于让它起作用了。我刚刚将GPUImage的模糊滤镜的一些更改添加到框架中,因此我相信我有了一个合理的苹果模糊效果的复制品,他们将其用于控制中心视图等。

以前,我在框架中的模糊使用一个预先计算的半径,影响它们强度的唯一方法是调整它们从输入图像中采样像素的间距。在每个像素的样本数量有限的情况下,将采样像素之间的间距的倍数更改为远远高于1.5的倍数会在跳过像素时引入严重的块效应。

我构建的新的高斯模糊实现将预先计算的高斯权重的性能优势与对高斯模糊使用任意半径(sigma)的能力相结合。它通过动态生成各种半径所需的着色器来实现这一点。它还通过使用硬件插值一次读取每个采样点的两个纹理像素,减少了给定模糊半径所需的纹理采样数。

新的GPUImageiOSBlurFilter结合了调谐的任意半径高斯模糊滤镜和色彩校正滤镜,似乎复制了苹果公司对模糊后的颜色进行的调整。我在我的答案here中添加了下面的对比,但它从左边的控制中心视图显示了苹果内置的模糊效果,在右边显示了我新的GPUImage模糊滤镜:

为了提高性能(苹果的模糊出现在sigma为48,这需要对每个像素进行相当大的区域采样),我在高斯模糊之前使用4倍的下采样,然后使用4倍的上采样。这将需要模糊的像素数减少16倍,并将模糊sigma从48减少到12。iPhone 4S可以使用此过滤器在大约30毫秒内模糊整个屏幕。

弄清楚模糊是一回事。Apple仍然没有提供一种快速获取视图背后的图像内容的方法,因此很可能会成为您快速变化的内容的瓶颈。

票数 32
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18404907

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档