有一些问题涉及在苹果平台上的不同颜色空间之间进行颜色转换。不幸的是,答案往往包括非便携式的Objective-C类“NSColor”或“UIColor”,这些类无法在OS X和iOS上可互换使用。
因此,我想问一个非常具体的问题,我相信必须有一个好的答案。我简直不能相信苹果不会预见到这个需求。
如何以通用方式将一个颜色空间(例如单色)中的CGColor转换为另一个颜色空间(例如RGB),同时支持所有CGColorSpace类型,并仅使用便携式Core Graphics函数?
一些背景。我需要将在线服务提供的值与存储在UIColor中的值相乘。在iOS5之前正确提取RGB组件的方法(最终引入了方法“- [UIColor getRed:green:blue:alpha:]”)是使用“CGColorGetComponents()”。然后,我将此颜色乘以从在线服务获取的颜色。如果使用“+ [UIColor grayColor]”生成UIColor,则会失败。这意味着我需要将灰度颜色空间转换为RGB。在这种情况下,这很容易。提供其他颜色空间怎么办?或者在理论上的未来情况下,如果我只想处理单个像素的颜色怎么办?
某处有建议,可以将像素绘制到位图上下文中,然后读取此像素。那太疯狂了,我希望这不是唯一的方法。显然,绘图方法可以解决如何执行转换的问题;我们如何利用它而不创建位图上下文来仅在其中绘制像素呢?
附加研究:这篇文章 关于颜色转换,除了
WebKit中的 ColorCG.cpp 表示有一个名为
我唯一找到提到
因此,我想问一个非常具体的问题,我相信必须有一个好的答案。我简直不能相信苹果不会预见到这个需求。
如何以通用方式将一个颜色空间(例如单色)中的CGColor转换为另一个颜色空间(例如RGB),同时支持所有CGColorSpace类型,并仅使用便携式Core Graphics函数?
一些背景。我需要将在线服务提供的值与存储在UIColor中的值相乘。在iOS5之前正确提取RGB组件的方法(最终引入了方法“- [UIColor getRed:green:blue:alpha:]”)是使用“CGColorGetComponents()”。然后,我将此颜色乘以从在线服务获取的颜色。如果使用“+ [UIColor grayColor]”生成UIColor,则会失败。这意味着我需要将灰度颜色空间转换为RGB。在这种情况下,这很容易。提供其他颜色空间怎么办?或者在理论上的未来情况下,如果我只想处理单个像素的颜色怎么办?
某处有建议,可以将像素绘制到位图上下文中,然后读取此像素。那太疯狂了,我希望这不是唯一的方法。显然,绘图方法可以解决如何执行转换的问题;我们如何利用它而不创建位图上下文来仅在其中绘制像素呢?
附加研究:
UIColor
的未公开/私有方法 -styleString
,更有趣的是提到了未公开的 CGColorTransform
。CoreGraphics/CGColorTransform.h
的头文件。不幸的是,在至少Mountain Lion上,这个头文件并不存在。为什么苹果要隐藏这些API呢?CGColorTransform
的资源是 FreeQuartz,一个Core Graphics的自由/开源重新实现。我向苹果提交了 #12141580 号 radar,以开放和记录 CGColorTransform
。然而我没有抱太大指望,如果有其他明智的建议,我会听取。
-[NSString pathExtension]
呢?人们在其他语言中也乐意使用子字符串。如果需求量很低,那为什么苹果要添加-[UIColor getRed:green:blue:alpha:]
呢?你谈论能源 - 如果苹果可以解决问题,为什么成千上万的开发者要花费精力来重复造轮子呢?我理解你的观点,但我认为可以在不创建上下文或使用NSImage
/CGImage
的情况下完成某些事情。使用vImage听起来很有趣,能否提供一个示例作为答案呢? - Ivan Vučica