Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS上的快速模糊_Objective C_Image_Image Processing_Uiimageview_Core Graphics - Fatal编程技术网

Objective c iOS上的快速模糊

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下的所有层混合成一幅图像。然后模糊图像并将其显示在所有内容上 我尝试过的模糊方法有: 以及一些定制

我在iOS应用程序中尝试模糊部分屏幕时遇到了麻烦。请参阅图片,以更好地了解我正在尝试做什么

只有“BlurBox”的内容需要模糊,但其他内容可以清晰。因此,如果您正在查看表格视图,则只有BlurBox下方的内容会变得模糊(即使在滚动时)。剩下的就看清楚了

我的第一种方法是每隔.01s调用
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
是否可以作为