iOS上的快速模糊
image
image-processing
objective-c
5
0

我在尝试模糊我的iOS应用中的部分屏幕时遇到麻烦。查看图片以更好地了解我要做什么。

模糊框

只有“ BlurBox”的内容需要模糊,其余的可以清晰。因此,如果您查看表视图,则只有BlurBox下面的内容会模糊(即使滚动)。其余的看起来很清楚。

我的第一种方法是每隔.01s调用一次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”的帮助。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

我建议使用Brad Larson的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];
收藏
评论

尽管响应可能有点晚,但是您可以使用Core Image过滤器。之所以这么慢是因为这条线。

CIContext *context = [CIContext contextWithOptions:nil];

在Apple文档中,为了获得Core Image的最佳性能,他们首先声明

“不要在每次渲染时都创建一个CIContext对象。上下文会存储很多状态信息;重用它们会更有效。”

我个人的解决方案是为Core Image Context创建Singleton。所以我只创造一个。

我的代码在GitHub上的此演示项目中。

https://github.com/KyleLopez/DemoCoreImage

随意使用它,或根据自己的喜好找到其他解决方案。我在CoreImage中找到的最慢的部分是上下文,此后的图像处理确实非常快。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号