在颜色空间之间转换CGColors的正确方法

Iva*_*ica 26 macos core-graphics colors cgcolorspace ios

有几个问题要求在Apple平台上的颜色空间之间转换颜色.不幸的是,答案通常涉及NSColorUIColor- 不可移植的Objective-C类,不能在OS X和iOS上互换使用.

所以我想问一个非常具体的事情,我确信必须有一个很好的答案.我简直无法相信苹果公司不会预见到这一点.

如何只使用便携式核心图形功能,如何CGColor以通用方式将一种颜色空间(例如单色)转换为另一种颜色空间(例如RGB),支持所有CGColorSpace类型?


一些背景.我需要将在线服务提供的值乘以存储的值UIColor.在最终引入该方法的iOS5之前提取RGB组件的正确方法-[UIColor getRed:green:blue:alpha:]是使用CGColorGetComponents().然后,我将此颜色与从在线服务获取的颜色相乘.在+[UIColor grayColor]用于生成的情况下失败UIColor.意思是,我需要将颜色从灰度颜色空间转换为RGB.在这种情况下,这很容易.那提供的其他颜色空间怎么样?或者如果在理论上的未来情景中我只想处理单个像素的颜色呢?

有人建议我将一个像素绘制到位图上下文中然后读取这个像素.这是疯了,我希望这不是唯一的方法.显然,绘图方法可以弄清楚如何执行转换; 我们如何才能在不创建位图上下文的情况下利用它来仅绘制像素?


其他研究:

  • 关于颜色转换的这篇文章除了UIColor没有文档/私有方法之外-styleString,更有趣的是还提到了无证文件CGColorTransform.
  • WebKit的ColorCG.cpp建议有一个名为的标题CoreGraphics/CGColorTransform.h.不幸的是,这个标题不存在,至少在Mountain Lion上不存在.为什么Apple会隐藏这些API?
  • 我发现提到CGColorTransform的唯一其他敏感资源是FreeQuartz,这是Core Graphics的免费/开源重新实现.

向Apple提供雷达#12141580,打开并记录文件CGColorTransform.不过,我并没有屏住呼吸,所以如果有其他明智的建议,我全都听见了.

an0*_*an0 7

Apple 在 iOS 9 和 macOS 10.11 中添加了这个 API:

  • 对象: CGColorCreateCopyByMatchingToColorSpace
  • 迅速: CGColor.converted(to:intent:options:)


Iva*_*ica 6

Apple对rdar的官方回应#12141580我要求曝光CGColorTransform:

非常感谢您的反馈.

Engineering已确定不会根据以下信息更改行为:

使用ColorSync.

如果您对此问题的解决方案有疑问,请使用该信息更新您的错误报告.

我们现在正在关闭此错误报告.

对于可能影响此问题的任何更新,请务必定期检查新的Apple版本.

无论谁写出这种回应,显然都有必要非常详细地解释这个决定.特别是建议使用高度复杂的API(如ColorSync)的决定.