从和CIImage获取UIImage时遇到问题。下面的代码行在iOS6上运行良好:(输出图像是CIImage)
self.imageView = [UIImage imageWithCIImage:outputImage];
或
[self.imageView setImage:[UIImage imageWithCIImage:outputImage]];
当我在运行iOS 5的设备上运行同一行代码时,imageView为空。如果我记录UIImage的大小属性,它是正确的,但图像永远不会显示在屏幕上。
当我使用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会导致如此大规模的堆增长?
谢谢
在iOS 5.0上,-imageWithCIImage:
似乎从未正常工作,我们被告知使用您上面描述的-createCGImage:fromRect:
方法,以便将核心图像过滤器链渲染为光栅输出。
正如您所看到的,这样做的缺点是-createCGImage:fromRect:
会以目标图像的大小创建一个新的CGImageRef,并且其核心的位图会传递给新的UIImage。这可能意味着,在内存中的某一点上,至少有两个完整的位图表示最终过滤的帧,如果这些是大图像,可能会导致相当大的峰值。
-imageWithCIImage:
在iOS 6.0中似乎已经修复(Core Image从5.0到6.0进行了很多改进)。虽然我只能推测为什么它不会导致内存峰值,但我敢打赌,这是由于使用了纹理缓存来在过滤过程中输出的OpenGL ES纹理和存储在UIImage中的最终位图之间共享内存。我在我的GPUImage框架中这样做是为了在过滤大图像时减少内存消耗,Core Image也这样做是有意义的。同样,这只是猜测。
不幸的是,如果你想在应用程序中支持iOS 5.0,你似乎需要在这里做一点版本测试,然后回到从CIImages获取输出的旧方式。