我在从 CIImage 获取 UIImage 时遇到问题。下面的代码行在 iOS6 上运行良好:(输出图像是 CIImage)
self.imageView = [UIImage imageWithCIImage:outputImage];
or
[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 获取输出的旧方法。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)