从 CIImage 获取 UIImage 无法正常工作

dan*_*550 5 iphone core-image uiimage cgimageref ciimage

我在从 CIImage 获取 UIImage 时遇到问题。下面的代码行在 iOS6 上工作正常:(输出图像是 CIImage)

self.imageView = [UIImage imageWithCIImage:outputImage];
Run Code Online (Sandbox Code Playgroud)

或者

[self.imageView setImage:[UIImage imageWithCIImage:outputImage]];
Run Code Online (Sandbox Code Playgroud)

当我在运行 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);
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么 UIImage imageWithCIImage 不起作用?根据 UIImage 类参考,它应该适用于 iOS5 及更高版本。另外为什么使用 CGImageRef 会导致如此大量的堆增长?

谢谢

Bra*_*son 4

在 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 获取输出的旧方法。

  • @dana0550 你有没有找到这个问题的最佳解决方案?看来 imageWithCIImage 在 iOS 8 中仍然存在 bug。 (3认同)
  • 我发现 imageWithCIImage 从 iOS 8 开始仍然有很多 bug (2认同)
  • iOS 12 中似乎也存在 bug。 (2认同)