Objective c iOS上的快速模糊
我在iOS应用程序中尝试模糊部分屏幕时遇到了麻烦。请参阅图片,以更好地了解我正在尝试做什么 只有“BlurBox”的内容需要模糊,但其他内容可以清晰。因此,如果您正在查看表格视图,则只有BlurBox下方的内容会变得模糊(即使在滚动时)。剩下的就看清楚了 我的第一种方法是每隔.01s调用Objective c iOS上的快速模糊,objective-c,image,image-processing,uiimageview,core-graphics,Objective C,Image,Image Processing,Uiimageview,Core Graphics,我在iOS应用程序中尝试模糊部分屏幕时遇到了麻烦。请参阅图片,以更好地了解我正在尝试做什么 只有“BlurBox”的内容需要模糊,但其他内容可以清晰。因此,如果您正在查看表格视图,则只有BlurBox下方的内容会变得模糊(即使在滚动时)。剩下的就看清楚了 我的第一种方法是每隔.01s调用UIGraphicsGetImageFromCurrentImageContext(),将BlurBox下的所有层混合成一幅图像。然后模糊图像并将其显示在所有内容上 我尝试过的模糊方法有: 以及一些定制
UIGraphicsGetImageFromCurrentImageContext()
,将BlurBox下的所有层混合成一幅图像。然后模糊图像并将其显示在所有内容上
我尝试过的模糊方法有:
以及一些定制的尝试。我也看过苹果的,但我认为我在这里所做的有点过头了
问题是它们都是到慢。该应用程序不在应用商店中运行,因此我愿意使用任何私有/未记录的框架
我有一个远大的想法,那就是覆盖我使用的所有组件(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]];
CALayer *backgroundLayer = [CALayer layer];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
backgroundLayer.backgroundFilters = [NSArray arrayWithObject:blurFilter];
[[self.view layer] addSublayer:backgroundLayer];
这确实有效,但是速度非常慢(
我发现一些实现只有在传入从磁盘加载的映像时才会模糊。如果传入使用UIGraphicsGetImageFromCurrentImageContext()
更新:
我尝试了帕特尔的建议如下:
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]];
CALayer *backgroundLayer = [CALayer layer];
CIFilter *blurFilter = [CIFilter filterWithName:@"CIGaussianBlur"];
[blurFilter setDefaults];
backgroundLayer.backgroundFilters = [NSArray arrayWithObject:blurFilter];
[[self.view layer] addSublayer:backgroundLayer];
但是,它不起作用:(
自BOUNTY添加以来的更新:
自从他添加了动态将图像标准化为RGBA格式(32位/像素)的功能后,我就成功地使用BlurBox正常工作了。但是,它仍然非常慢
我有一个计时器,每隔0.03秒调用一次更新,以抓取模糊框下面的图像,模糊该图像,并将其显示在屏幕上。我需要帮助提高模糊框上的“fps”。您可以尝试Apple Core image Filter(CIFilter)例程集。它们需要iOS 5,因此您可能无法使用它们
我不确定它是否比你尝试过的方法更快,但我在过去的项目中使用过它,而且效果非常好。如果你能抓住屏幕上想要模糊的部分,将其放入图像中,通过过滤器,然后在屏幕上的适当位置重新显示,应该可以
我使用滤镜实时改变图像的颜色,效果很好
您是否尝试过此库:
它使用vDSP/Accelerate框架,似乎易于使用
顺便说一句:0.01s似乎太快了。0.03也应该可以。我还没有测试过这一点,但我想知道你是否可以将CALayer
放在你想要模糊框的地方,然后找到一个有用的CIFilter
,你可以在CALayer的背景过滤器上设置。想一下
请参见我建议您使用的GPUImage,它完全由GPU支持,具有多种图像处理效果。它速度非常快,甚至足够快,在他的演示应用程序中,他可以从相机进行实时视频处理,帧速率非常好
下面是我编写的一个代码片段,用于应用基本的框模糊,使图像的底部和顶部三分之一模糊,但使图像的中间部分不模糊。他的库非常广泛,包含几乎所有可以想象的图像过滤效果
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];
虽然响应可能有点晚,但您可以使用核心图像过滤器。它如此缓慢的原因是这条线
CIContext *context = [CIContext contextWithOptions:nil];
在苹果的文档中,为了在核心图像中获得最佳性能,他们首先声明
“不要每次渲染时都创建CIContext
对象。
上下文存储了大量的状态信息;重用它们更有效。”
我个人的解决方案是为核心图像上下文创建一个单例,所以我只创建一个
我的代码在GitHub的这个演示项目中
您可以随意使用它,或者找到另一个您喜欢的解决方案。我在CoreImage中发现的最慢的部分是上下文,之后的图像处理速度非常快。您介意发布一些代码说明您是如何做到这一点的吗?我昨天尝试了几个小时,但始终无法让它与CIFilters一起使用。我注意到,我尝试的一些方法d、 只有当我传递从磁盘加载的图像时,它才会模糊。如果我尝试传递我用UIGraphicsGet抓取的图像,它将不起作用。我已更新了我的问题,以显示我如何使用CIFilter。你能检查正确性吗?看起来你已经使用GIGaussianBlur(从上面的更新中)了CIFilter,而且速度太慢。我使用了另一个过滤器,这在这里没有帮助,抱歉。如果我打开它,它的刷新率仍然落后。是的,我尝试了gdawg的库。问题是它不会模糊我用UIGraphicsGet抓取的图像。它只会模糊我从磁盘加载的图像。知道为什么吗?@random UIImage由CIImage或CGImage支持:但gdawg的lib只支持CGImage(对于但是如果你愿意的话,你可以把CiV象转换成一个CGIMAGE。或者你可以考虑在第一个地方保留一个CGIMAGE。iCux> CiBOXBLUR <代码>在iOS上不存在。尝试<代码> CigaSuangnBurr CigaSuangBurru/<代码>在iOS 5上不存在。内置分类仅提及iOS 6.0版的StackBluriOS
不起作用,那么compositingFilter
是否可以作为