【发布时间】:2012-09-04 20:37:54
【问题描述】:
我在尝试模糊 iOS 应用中的部分屏幕时遇到了麻烦。请参阅图片以更好地了解我正在尝试做的事情。
只有“BlurBox”的内容需要模糊,其余的可以清晰。因此,如果您正在查看表格视图,则只有 BlurBox 下方的内容会变得模糊(即使在您滚动时)。其余的看起来很清楚。
我的第一种方法是每隔 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];
以及一些自定义尝试。我还查看了 Apple 的 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's stackblur 使 BlurBox 正常工作,因为他添加了动态将图像标准化为 RGBA 格式(32 位/像素)的功能。但是,它仍然很慢。
我有一个计时器,每 0.03 秒调用一次更新,以抓取 BlurBox 下方的图像,模糊该图像,并将其显示在屏幕上。我需要帮助来提高 BlurBox 上的“fps”。
【问题讨论】:
-
CIBoxBlur在 iOS 上不存在。试试CIGaussianBlur -
Oups...刚刚看到
CIGaussianBlur在 iOS 5 上也不存在 -
GIGaussianBlur 确实有效,但它真的很慢。
-
啊...我在看内置类别
-
只是提到
StackBluriOS不适用于iOS 6.0
标签: objective-c image image-processing uiimageview core-graphics