我无法从CIImage获取UIImage。下面的代码行在iOS6上运行正常:(输出图像是CIImage)
self.imageView = [UIImage imageWithCIImage:outputImage];
或
[self.imageView setImage:[UIImage imageWithCIImage:outputImage]];
当我在运行iOS 5的设备上运行同一行代码时,imageView为空白。如果我记录UIImage的size属性是正确的,但图像永远不会显示在屏幕上。
当我使用CGImageRef(如下所示)时,它在两个设备上都能正常工作,但是当我进行堆镜头分析时会导致巨大的内存增长。
context = [CIContext contextWithOptions:nil];
CGImageRef ref = [context createCGImage:outputImage fromRect:outputImage.extent];
self.imageView.image = [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationUp];
CGImageRelease(ref);
有谁知道为什么UIImage imageWithCIImage不起作用?根据UIImage类引用,它应该适用于iOS5及更高版本。另外为什么使用CGImageRef会导致如此庞大的堆增长?
谢谢
答案 0 :(得分:3)
在iOS 5.0上,-imageWithCIImage:
似乎从未正常工作,我们被告知要使用您在上面描述的-createCGImage:fromRect:
方法,以便将Core Image滤镜链渲染为光栅输出。
如您所见,其缺点是-createCGImage:fromRect:
以目标图像的大小创建一个新的CGImageRef,其核心位图将传递给您的新UIImage。这可能意味着您至少有两个完整的位图在内存中代表您的最终过滤帧,如果这些是大图像,可能会导致相当大的峰值。
似乎已在iOS 6.0中修复了-imageWithCIImage:
(Core Image已经从5.0到6.0进行了很多改进)。虽然我只能推测为什么它不会导致这种内存峰值,但我敢打赌这是因为使用了一个纹理缓存来共享来自过滤进程的输出OpenGL ES纹理和存储在你的最终位图之间的内存。 UIImage的。我在我的GPUImage框架中执行此操作以减少过滤大图像时的内存消耗,而Core Image也可以这样做。再次,这只是推测。
不幸的是,看起来你需要在这里进行一些小版本的测试,如果你想在你的应用程序中支持iOS 5.0,你可以回到从CIImages获取输出的旧方法。