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(原始)上:sRgb
和 profData
将为 NULL。
在运行 iOS 8.3 的 iPad 3 上:sRgb
和 profData
将为 NULL。
在运行 iOS 9.2.1 的 iPhone 6 Plus 上:sRgb
将包含非 NULL CGColorSpaceRef
,profData
将包含非 NULL CFDataRef
缓冲区。
在运行 iOS 9.2.1 的 iPad Mini(原始)上:sRgb
将包含非 NULL CGColorSpaceRef
,profData
将包含非 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 颜色空间中(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 之前也没有任何作用。
所以你有几个选择:
-
仅支持 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 和颜色管理状态?的主要内容,如果未能解决你的问题,请参考以下文章