iOS 上的 CGColorSpace API 和色彩管理状态



我目前正在尝试了解iOS上CGColorSpace Color Management API的当前状态。在iOS 8.1 SDK之前(据我所知(,CGColorSpace.h中的许多函数和常量都被标记为__IPHONE_NA。但是,根据iOS 8.1 API Diffs for Core Graphics,以前__IPHONE_NA的许多函数和常量都已更新为__IPHONE_2_0。那么我们应该如何解释呢?

我不认为苹果追溯性地在旧的iOS版本中添加了对这些功能的支持,而是他们只是将这些功能的可见性从私有更改为公共。当尝试在不同的iOS版本和设备上使用其中一些功能时,问题就出现了。例如:

CGColorSpaceRef sRgb = CGColorSpaceCreateWithName( kCGColorSpaceSRGB ); // kCGColorSpaceSRGB is labeled __IPHONE_8_0  
CFDataRef   profData = CGColorSpaceCopyICCProfile( ... );  
  • 在运行iOS 8.2的iPad Mini(原始(上:sRgbprofData将为NULL。
  • 在运行iOS 8.3的iPad 3上:sRgbprofData将为NULL。
  • 在运行iOS 9.2.1的iPhone 6 Plus上:sRgb将包含一个非NULL CGColorSpaceRefprofData将包含一个非NULL CFDataRef缓冲区。
  • 在运行iOS 9.2.1的iPad Mini(原始(:sRgb将包含一个非NULL CGColorSpaceRefprofData将包含一个非NULL CFDataRef缓冲区。

因此,至少对于iOS 8,这些功能似乎并未完全实现。对于iOS 9,事情似乎开始工作。

是否有任何文档或资源描述了这些 API 在 iOS 8 和 iOS 9 中的变化情况?当CGColorSpaceCreateWithName( kCGColorSpaceSRGB )返回 NULL 时应该使用什么颜色空间?在这种情况下,似乎CGColorSpaceCreateDeviceRGB()可能是唯一的选择。

经过一些测试,我发现可以从CGImageRef获取嵌入的颜色配置文件,并使用该配置文件将颜色转换应用于另一个颜色空间,只要您自己进行颜色转换即可。核心图形 API 仍然不支持在色彩空间之间转换图像,但如果您有自己的色彩管理功能,现在可以在 iOS 上自己完成 - 这在以前是不可能的。

我只想知道什么是有效的,什么是不预期的。我尝试浏览发行说明并查找描述从iOS 7到8和8到9更改的技术说明,但是我找不到任何描述CGColorSpace API更改的内容。有谁知道是否有这样的文件?

您的发现是正确的——在 iOS 9 之前,不支持 ColorSync/CGColorSpace;假定所有图像资源都位于设备的 sRGB 色彩空间中(CGColorSpace的文档用于声明"iOS 不支持 ColorSync,因此所有资产都应在本机设备颜色空间中提供:sRGB">(。

因此,即使CGColorSpace/CGColorSpaceRef存在于早期版本中,它直到iOS 9.0才做任何事情。

因此,您有以下几种选择:

  1. 仅支持 iOS 9 或更高版本。
  2. 在iOS 9+上使用适当的色彩空间渲染; iOS 8-用户只会获得不太准确的图像颜色渲染。
  3. 使用@SumitKumarSaha建议的第三方库。

同样值得注意的是,在过去一年左右的时间里,色彩空间准确的渲染已经变得很重要——iPad Pro 9.7英寸(2016年(、iPad Pro 10.5英寸和12.9英寸(2017年(、iPhone 7和7 Plus(2016年(,以及这些产品线中的新型号都使用Display P3宽色彩空间(基于DCI P3(。

更多信息,请参阅 WWDC 2015 会议 510 - 核心映像中的新增功能。

你可以看看一个名为little-CMS的开源库。它提供了良好的结果,您可以将其集成到您的应用程序中。

https://github.com/mm2/Little-CMS

相关内容

  • 没有找到相关文章

最新更新