为什么需要在图像格式之间进行如此多的转换?(UIImage,CGImage,CIImage)

No *_*ing 5 core-image uikit ios

我很困惑为什么在iOS中需要在图像格式之间进行如此多的转换.例如,如果我将jpg加载到UIImage中然后想要对其进行面部检测,我需要创建一个CIImage以传递给CIDetector.这不代表内存和性能的打击吗?

这是Core Graphics,Core Image和UIKit(可能还有openGL ES,但我不能使用它)之间的遗留物吗?总体而言是重要的琐事?

我会做我需要做的事情,但我想更多地了解这是需要的.此外,我遇到有时会进行转换的问题,并且会混淆格式之间的差异.


更新

好的 - 所以我对这些格式的困惑(或这些格式的混乱......)再次感到震惊.浪费了半个小时.这是我在做的事情:

测试本地图像中的面部,我创建了所需的CIImage:

CIImage *ciImage = [image CIImage];
Run Code Online (Sandbox Code Playgroud)

无论我传入什么方向,我都没有得到任何功能.我知道这个特殊的图像与CIDetectorTypeFace之前的版本有关,而且我遇到了CIImage格式问题.尝试创建CCImage像这样:

 CIImage *ciImage = [CIImage imageWithCGImage:image.CGImage];
Run Code Online (Sandbox Code Playgroud)

和人脸检测工作正常.Arrgh!我确信[image CIImage]最终的CIImage不是零.所以我很困惑.第一种方法只获得一个指针,而第二种方法创建一个新的CIImage.这有什么不同吗?

深入研究UIImage.h文件,我看到以下内容:

// returns underlying CGImageRef or nil if CIImage based
@property(nonatomic,readonly) CGImageRef  CGImage; 

// returns underlying CIImage or nil if CGImageRef based
@property(nonatomic,readonly) CIImage     *CIImage;  
Run Code Online (Sandbox Code Playgroud)

所以我猜这是关键 - 开发者要小心:测试没有...

小智 0

原因就在观念上。UIKit、CoreGraphics 和 CoreImage 都做了三件根本不同的事情,因此不可能存在“大中央统一图像格式”。而且,这些框架配合得很好;也就是说,转换应该尽可能优化和尽可能快,但当然图像处理始终是一项计算成本相对较高的操作。