CGColorSpace API的状态& iOS上的色彩管理?

时间:2016-02-17 22:22:53

标签: ios core-graphics cgimage color-management cgcolorspace

我目前正试图围绕iOS上CGColorSpace色彩管理API的当前状态。在iOS 8.1 SDK之前(据我所知)许多功能& CGColorSpace.h中的常量标记为__IPHONE_NA。但是,根据核心图形的iOS 8.1 API Diffs许多功能&之前__IPHONE_NA的常量已更新为__IPHONE_2_0。那么我们该怎么解释呢?

我认为Apple并不追溯性地将这些功能添加到旧iOS版本中,而只是将这些功能的可见性从私有变为公共。尝试在不同的iOS版本上使用其中一些功能时出现问题。设备。例如:

CGColorSpaceRef sRgb = CGColorSpaceCreateWithName( kCGColorSpaceSRGB ); // kCGColorSpaceSRGB is labeled __IPHONE_8_0  
CFDataRef   profData = CGColorSpaceCopyICCProfile( ... );  
  • 在运行iOS 8.2的iPad Mini(原创)上:sRgb& profData将为NULL。
  • 在运行iOS 8.3的iPad 3上:sRgb& profData将为NULL。
  • 在运行iOS 9.2.1的iPhone 6 Plus上:sRgb将包含非NULL CGColorSpaceRefprofData将包含非NULL CFDataRef缓冲区。< / LI>
  • 在运行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获取嵌入的颜色配置文件并使用该配置文件将颜色转换应用到另一个颜色空间,只要您自己进行颜色转换即可。 Core Graphics API仍然不支持在色彩空间之间转换图像,但是如果你有自己的色彩管理功能,现在可以在iOS上自己做 - 这是之前无法实现的。

我只想知道什么是有效的,有效的。我已经尝试查看发行说明并寻找描述从iOS 7到8和8到9的变化的技术说明,但我还没有找到任何描述CGColorSpace API变化的内容。有谁知道是否有这样的文件?

2 个答案:

答案 0 :(得分:1)

您的发现是正确的 - 在iOS 9之前,不支持ColorSync / CGColorSpace;假设所有图像资源都在设备的sRGB颜色空间CGColorSpace used to state “iOS does not support ColorSync, so all assets should be provided in the native device color space: sRGB”的文档)

所以尽管早期版本中存在CGColorSpace / CGColorSpaceRef,但在iOS 9.0之前它没有做任何事情。

所以你有几个选择:

  1. 仅支持iOS 9或更高版本。
  2. 在iOS 9+上使用正确的色彩空间渲染; iOS 8-用户将获得不太准确的图像颜色渲染。
  3. 使用第三方库,例如@SumitKumarSaha建议。
  4. 值得注意的是,在过去的一年左右,色彩空间精确渲染已成为一个更大的问题 - iPad Pro 9.7“(2016),iPad Pro 10.5”&amp; 12.9“(2017),iPhone 7&amp; 7 Plus(2016)以及这些产品系列中的较新型号均使用Display P3宽色空间(基于DCI P3)。

    WWDC 2015 Session 510 - What's New in Core Image的更多信息。

答案 1 :(得分:0)

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

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