我在尝试模糊我的iOS应用程序屏幕的某个部分时遇到了麻烦。请查看图像以更好地了解我的尝试。
我的第一种方法是每隔0.01秒调用
UIGraphicsGetImageFromCurrentImageContext()
来获取BlurBox下的所有图层并将其压缩成一个图像。然后对该图像进行模糊处理,并在其上方显示出来。我尝试过的模糊方法有:
https://github.com/tomsoft1/StackBluriOS
https://github.com/coryleach/UIImageAdjust
https://github.com/esilverberg/ios-image-filters
https://github.com/cmkilger/CKImageAdditions
[layer setRasterizationScale:0.25];
[layer setShouldRasterize:YES];
除了一些自定义尝试之外,我还研究了苹果的GLImageProcessing,但我认为它对我在这里要做的事情有点过度。
问题在于它们都太慢了。该应用程序不会上架到应用商店,因此我可以使用任何私有/未文档化的框架。
我想到的一个有点离谱的想法是覆盖我使用的所有组件(UITableViewCells、UITableView等)的drawRect
方法,并在运行时独立地模糊每个组件。然而,这需要一些时间,这听起来甚至可行吗?
更新:
我尝试使用如下的CIFilters
:
CIImage *inputImage = [[CIImage alloc] initWithImage:[self screenshot]];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
[blurFilter setValue: inputImage forKey: @"inputImage"];
[blurFilter setValue: [NSNumber numberWithFloat:10.0f]
forKey:@"inputRadius"];
CIImage *outputImage = [blurFilter valueForKey: @"outputImage"];
CIContext *context = [CIContext contextWithOptions:nil];
self.bluredImageView.image = [UIImage imageWithCGImage:[context createCGImage:outputImage fromRect:outputImage.extent]];
这个确实能够工作,但是速度非常慢。:(
我发现有些实现只会对从磁盘加载的图像进行模糊处理。如果我传入使用
UIGraphicsGetImageFromCurrentImageContext()
创建的UIImage,则无法工作。你有任何想法吗?
更新:
我已尝试patel的建议,如下所示:
CALayer *backgroundLayer = [CALayer layer];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
backgroundLayer.backgroundFilters = [NSArray arrayWithObject:blurFilter];
[[self.view layer] addSublayer:backgroundLayer];
然而,它不起作用 :(
自添加赏金以来的最新更新:
我已成功使用TomSoft1的stackblur将BlurBox正确运作,因为他添加了在飞行中将图像规范化为RGBA格式(32位/像素)的能力。但它仍然相当慢。
我有一个计时器每0.03s调用一次更新,以获取BlurBox下方的图像,对该图像进行模糊处理,并在屏幕上显示出来。我需要在BlurBox上提高“fps”的帮助。
CIBoxBlur
在 iOS 上不存在。请尝试使用CIGaussianBlur
。 - epatelCIGaussianBlur
еңЁiOS 5дёҠд№ҹдёҚеӯҳеңЁгҖӮ - epatelStackBluriOS
不支持 iOS 6.0。 - geekay