Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.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
Ios 将CIImage转换为CGImage太慢_Ios_Xcode_Core Graphics_Cgimage_Ciimage - Fatal编程技术网

Ios 将CIImage转换为CGImage太慢

Ios 将CIImage转换为CGImage太慢,ios,xcode,core-graphics,cgimage,ciimage,Ios,Xcode,Core Graphics,Cgimage,Ciimage,我需要将CIImage转换为CGImage。这是我当前使用的代码: CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]]; 但是对于常规大小的图像,他的代码行非常慢。要慢很多,我才能正确地使用它。是否有其他更快的方法将这些CIImages转换为cgmimages 最后,我使用Core Graphics将CGImages绘制到CGContext。如果有一种方法可以直接将CIImages绘制到CGC

我需要将
CIImage
转换为
CGImage
。这是我当前使用的代码:

CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]];
但是对于常规大小的图像,他的代码行非常慢。要慢很多,我才能正确地使用它。是否有其他更快的方法将这些
CIImages
转换为
cgmimages

最后,我使用
Core Graphics
CGImages
绘制到
CGContext
。如果有一种方法可以直接将
CIImages
绘制到
CGContext
中,我认为这也应该更快。这可能吗

感谢来自以下网站的

尽管CIImage对象具有与其关联的图像数据,但它不是 图像。您可以将CIImage对象视为图像“配方”。a CIImage对象具有生成图像所需的所有信息, 但核心图像在被告知之前不会真正渲染图像 所以这种“惰性评估”方法允许核心映像按以下方式运行: 尽可能高效

这意味着,在渲染图像之前,您可能已经对
CIImage
应用(或更好地请求应用)的任何过滤实际上都不会发生,在您创建
CGImageRef
时会发生这种情况。这可能就是你正在经历减速的原因

也就是说,在
CIImage
上进行过滤通常是一个非常快速的过程,因此根据您的图像大小,您应该给我们您的慢速定义

最后,要确保瓶颈确实在您认为的位置,您应该使用仪器

编辑

我刚刚尝试构建一个示例项目,通过应用
CIColorMap
颜色过滤器,过滤来自iPad3上的设备摄像头(960x540)的图像流,我获得了超过60fps(~16ms)的速度

根据应用程序的不同,通过重用
CIContext
ColorMapFilter
inputGradientImage
(如果不随时间变化)并在每次迭代中仅更新
inputImage
,您将获得更好的性能

例如,您可以调用
prepareframefilteroframe
一次,然后在要处理的每个帧上重复调用
applyFilteroframe:

@property (nonatomic, strong) CIContext *context;
@property (nonatomic, strong) CIFilter *colorMapFilter;

- (void)prepareFrameFiltering {
    self.context = [CIContext contextWithOptions:nil];
    CIImage *colorMap = [CIImage imageWithCGImage:[UIImage imageNamed:@"gradient.jpg"].CGImage];
    self.colorMapFilter = [CIFilter filterWithName:@"CIColorMap"];
    [self.colorMapFilter setValue:colorMap forKey:@"inputGradientImage"];
}

- (void)applyFilterToFrame:(CIImage *)ciFrame {    
    // filter
    [self.colorMapFilter setValue:ciFrame forKey:@"inputImage"];
    CIImage *ciImageResult = [self.colorMapFilter valueForKey: @"outputImage"];

    CGImageRef ref = [self.context createCGImage:ciImageResult fromRect:ciFrame.extent];

    // do whatever you need

    CGImageRelease(ref);
}

渲染CIImage的最快方法是渲染为EagleContext

将CIImage呈现到CGContext中的性能不高,因为CI在GPU上工作,而CG是一个CPU呈现器。CI必须将其结果从GPU读回CPU,以便CG可以渲染它


注意:如果映像小于4K,则调用createCGImage:时将发生此回读。如果图像较大,则调用CGContextDrawImage时会发生这种情况。

啊,很有趣。我不知道。因此,我猜我使用的CIFilter实际上太慢了。我正在使用一个颜色映射过滤器。对于一张600x800的图片,它需要大约1秒的时间才能渲染成CGImage。这对我来说有点太多了,因为我已经连续做了很多次了。无论如何,谢谢你的回答。我学到了一些东西。如果你知道如何加快这个过程,请告诉我。sry忘了提到,这是在我的macbook pro上的IOS模拟器上。在实际的设备上,这甚至是个麻烦。这很奇怪,因为我认为CIColorMap应该在GPU上执行,因此速度很快。我稍后会亲自检查。与此同时,你用的是什么设备?我有一台旧的iPad2,我在上面运行它,在模拟器上使用GPU实际上非常慢——事实上,它比在实际的iOS设备上使用GPU要慢。CIColorMap过滤器实际上非常简单,只需要一点数学知识和在渐变图像中查找。