有几个问题询问有关在 Apple 平台上的颜色空间之间转换颜色的问题。不幸的是,答案通常涉及NSColor
或UIColor
——不可在 OS X 和 iOS 上互换使用的不可移植的 Objective-C 类。
所以我想问一个非常具体的问题,我相信肯定有一个很好的答案。我简直不敢相信苹果不会预见到这种需求。
如何CGColor
以一种通用的方式从一种颜色空间(例如单色)转换为另一种颜色空间(例如 RGB),支持所有CGColorSpace
类型,同时仅使用可移植的 Core Graphics 功能?
一些上下文。我需要将在线服务提供的值与存储在UIColor
. iOS5之前的提取RGB分量的正确方法,最后介绍了方法-[UIColor getRed:green:blue:alpha:]
,就是使用CGColorGetComponents()
. 然后我将此颜色与从在线服务获取的颜色相乘。如果+[UIColor grayColor]
用于生成UIColor
. 意思是,我需要将颜色从灰度颜色空间转换为 RGB。在这种情况下,这很容易。提供其他一些色彩空间呢?或者如果在理论上的未来场景中我只想处理单个像素的颜色怎么办?
有一个建议是我将一个像素绘制到位图上下文中,然后读取这个像素。这太疯狂了,我希望这不是唯一的方法。显然绘图方法可以弄清楚如何进行转换;我们如何在不创建位图上下文仅在其中绘制像素的情况下利用它?
补充研究:
- 这篇关于颜色转换的文章,除了
UIColor
's undocumented/private method之外-styleString
,更有趣的还提到了 undocumentedCGColorTransform
s。 - WebKit 的 ColorCG.cpp建议有一个名为
CoreGraphics/CGColorTransform.h
. 不幸的是,这个标题不存在,至少在 Mountain Lion 上不存在。苹果为什么要隐藏这些 API? - 我发现提到 s 的唯一其他合理资源
CGColorTransform
是 FreeQuartz,它是 Core Graphics 的免费/开源重新实现。
向 Apple 提交了雷达 #12141580,以打开和记录CGColorTransform
. 不过,我并没有屏住呼吸,所以如果有其他明智的建议,我会全神贯注。