iOS上的快速模糊(Fast blur on iOS)

2019-06-27 20:01发布

我遇到了麻烦试图在我的iOS应用模糊画面的一部分。 对于什么,我试图做的更好的办法请参阅图像。

在“BlurBox”只有内容必须是模糊的,但其余的可以是清楚的。 所以,如果你在看表视图,只有BlurBox下面的内容将是模糊的(即使你滚动)。 其余的看起来清晰。

我的第一个方法是调用UIGraphicsGetImageFromCurrentImageContext()每.01s得到所有层下的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 ,但我认为这是什么,我想在这里做的有点矫枉过正。

问题是,他们都 放缓 。 该应用程序不会在App Store所以我愿意用任何私人/无证框架。

有种遥远的想法我是重写drawRect所有我使用(UITableViewCells,UITableView的,等等)的组件的方法和动态模糊独立每个人。 然而这将需要一些时间,这是否甚至听起来像一个可行的选择?


更新

我曾尝试使用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]];

这并不工作,但它是慢得令人难以置信。 :(

我看到,当我通过从磁盘加载图像中的一些实现只会模糊。 如果我通过,我使用创建一个UIImage UIGraphicsGetImageFromCurrentImageContext()这是行不通的。 为什么这会是什么想法?


更新

我曾尝试帕特尔的建议如下:

CALayer *backgroundLayer = [CALayer layer];

CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
backgroundLayer.backgroundFilters = [NSArray arrayWithObject:blurFilter];

[[self.view layer] addSublayer:backgroundLayer];

但是,它不工作:(


更新自BOUNTY新增:

我曾设法让BlurBox使用正常工作TomSoft1的stackblur因为他加入的飞行正常化RGBA格式的图像(32位/像素)的能力。 然而,它仍然是相当缓慢。

我有一个计时器调用一个更新每隔0.03秒抢到什么是BlurBox下方的形象,模糊的形象,并在屏幕上显示出来。 我需要提高的BlurBox的“FPS”帮助。

Answer 1:

我会建议布拉德拉尔森的GPUImage这是完全由GPU为各种各样的图像处理效果的支持。 它的速度非常快,甚至速度不够快,在他的演示应用程序,他从相机做实时视频处理和帧速率非常出色。

https://github.com/BradLarson/GPUImage

下面的代码片段,我写申请一个基本的盒子模糊其模糊的底部和图像的顶部三分之二,但保持图像未模糊的中间。 他的图书馆是非常广泛,几乎包含了一种图像滤镜效果可想而知。

GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:[self screenshot]];

GPUImageTiltShiftFilter *boxBlur = [[GPUImageTiltShiftFilter alloc] init];
        boxBlur.blurSize = 0.5;

[stillImageSource addTarget:boxBlur];

[stillImageSource processImage];

UIImage *processedImage = [stillImageSource imageFromCurrentlyProcessedOutput];


Answer 2:

虽然这可能有点来不及反应时,可以使用核心绘图过滤器。 它之所以如此缓慢是此行。

CIContext *context = [CIContext contextWithOptions:nil];

在苹果的文件,以获得在核心形象的最佳表现,他们首先声明

“不要创建CIContext对象每次渲染时上下文存储大量的状态信息;它更有效地重用他们。”

我个人的解决方案,这是为了让一个Singleton的核心图像内容。 所以,我只创建一个。

我的代码是在GitHub上的这个示范项目。

https://github.com/KyleLopez/DemoCoreImage

随意使用它,或者找到另一种解决方案,以自己的喜好。 我在CoreImage中发现的最慢的部分是背景,图像处理后的真快。



Answer 3:

我没有测试过这一点,但我不知道你能否把一个CALayer要被模糊的方块,然后找到一个有用的CIFilter ,你可以在设置CALayer's backgroundFilters 。 只是一个想法。

见CALayer.backgroundFilters



Answer 4:

你可以尝试苹果的核心图像过滤器(CIFilter)组例程。 他们需要的iOS 5,所以你可能不能够使用它们。

我不知道这是否是更快,那么你已经尝试过的方法,但我已经在过去使用它的项目,它的作品真的很好。 如果你能抓住你想模糊画面的一部分,将其写入图像,通过它通过一个过滤器,然后在屏幕上的适当位置,应该工作重新显示出来。

我使用的过滤器来改变图像的颜色实时,而且效果不错。

http://developer.apple.com/library/ios/#DOCUMENTATION/GraphicsImaging/Reference/QuartzCoreFramework/Classes/CIFilter_Class/Reference/Reference.html



Answer 5:

您是否尝试过这个库:

https://github.com/gdawg/uiimage-dsp

它使用VDSP /加速框架,非常易于使用。

BTW:0.01S似乎有些太快了。 0.03应该做的一样好。



文章来源: Fast blur on iOS