ios - iOS 上的 CGColorSpace API 和颜色管理状况如何?

标签 ios core-graphics cgimage color-management cgcolorspace

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

我认为苹果并没有追溯性地在旧的 iOS 版本中添加对这些功能的支持,而只是将这些功能的可见性从私有(private)更改为公开。当尝试在不同的 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 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 更改的内容。有谁知道有没有这样的文件?

最佳答案

您的发现是正确的 - 在 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 建议的那样。

还值得注意的是,在过去一年左右的时间里,色彩空间精确渲染已成为一个更重要的问题 - 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 .

关于ios - iOS 上的 CGColorSpace API 和颜色管理状况如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35468964/

相关文章:

core-graphics - 绘制离屏 CALayer 内容的最快方法

ios - UITableViewCell 中的动画立即完成

ios - iOS:在方法调用中使用CGBitmapContextCreate无法获得正确的结果

iphone - 是否可以在 iOS 应用程序中显示本地化定价信息

ios - 从 JSON 响应中获取字典数组中的数据

ios - Objective-C:设置 bool 值时遇到问题?

ios - CGImageCreateWithImageInRect 区域不正确?

ios - Objective-C:如果语句仅在第二次尝试后运行(iOS)

macos - CGDisplay创建图像矩形: how to ignore a specific NSWindow

ios - 加载 UIImage 并删除原始文件