【发布时间】: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将包含非 NULLCGColorSpaceRef,profData将包含非 NULLCFDataRef缓冲区。 - 在运行 iOS 9.2.1 的 iPad Mini(原始)上:
sRgb将包含非 NULLCGColorSpaceRef,profData将包含非 NULLCFDataRef缓冲区。
所以至少对于 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 更改的内容。有谁知道有没有这样的文件?
【问题讨论】:
-
提醒:如果您发现以下答案之一解决/回答了您的问题,请将其标记为已接受的答案!
标签: ios core-graphics cgimage color-management cgcolorspace