iOS 上的 CGColorSpace API 和颜色管理状态?

Posted

技术标签:

【中文标题】iOS 上的 CGColorSpace API 和颜色管理状态?【英文标题】:State of CGColorSpace APIs & Color Management on iOS? 【发布时间】:2016-02-17 22:22:53 【问题描述】:

我目前正试图了解 ios 上 CGColorSpace 颜色管理 API 的当前状态。在 iOS 8.1 SDK 之前(据我所知)CGColorSpace.h 中的许多函数和常量都被标记为__IPHONE_NA。然而,根据 Core Graphics 的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(原始)上: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 获取嵌入的颜色配置文件,并使用该配置文件将颜色转换应用到另一个颜色空间,只要您自己进行颜色转换。 Core Graphics API 仍然不支持在色彩空间之间转换图像,但如果您有自己的色彩管理功能,现在可以在 iOS 上自己完成——这在以前是不可能的。

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

【问题讨论】:

提醒:如果您发现以下答案之一解决/回答了您的问题,请将其标记为已接受的答案! 【参考方案1】:

您的发现是正确的——在 iOS 9 之前,不支持 ColorSync/CGColorSpace;所有图像资源都假定在设备的 sRGB 颜色空间中CGColorSpaceused 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 之前也没有任何作用。

所以你有几个选择:

    仅支持 iOS 9 或更高版本。 在 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 Session 510 - What's New in Core Image。

【讨论】:

【参考方案2】:

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

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

【讨论】:

我对 Little CMS 很熟悉,我们实际上在我们的应用程序中使用了它。然而,这个问题专门针对用于颜色管理的原生 iOS API,而不是可用的第三方库。

以上是关于iOS 上的 CGColorSpace API 和颜色管理状态?的主要内容,如果未能解决你的问题,请参考以下文章

RGBA 的 CGColorSpace 在哪里?

是否有 API 来检测 iOS 上的 CPU 功能?

iOS 内存崩溃上的 Web 音频 API

iOS上的蓝牙A2DP API支持?

IOS6.1 上的 Apple 802.11 API - 有人有正确的捆绑包吗?

iOS上的RestKit - 嵌套对象的后续API调用?