混合色彩空间会受到惩罚吗? (核心图形)

时间:2010-01-27 00:02:37

标签: iphone macos core-graphics cgcolorspace

如果我在Mac OS X或iPhone OS上的Core Graphics中编写绘图代码,我可以通过调用以下方式将活动填充颜色设置为红色:

CGContextSetRGBFillColor(context, 1.0, 0.0, 0.0, 1.0); // RGB(1,0,0)

如果我想要50%灰色,我可以致电:

CGContextSetRGBFillColor(context, 0.5, 0.5, 0.5, 1.0); // RGB(0.5,0.5,0.5)

但是对于灰色阴影,很容易做出一条较短的线并且打电话:

CGContextSetGrayFillColor(context, 0.5, 1.0);

但是,这个函数不是简单地调用RGB方法,强度值被复制三次;相反,它正在将上下文的颜色空间从DeviceRGB更改为DeviceGray。下一次调用RGB方法会将其切换回来。

我很想知道:

  • 切换色彩空间的代价是什么?
  • 当您的上下文的颜色空间与设备的原生色彩空间不匹配时,绘制是否会受到惩罚? (即,使用DeviceGray和DeviceRGB绘图)

我要求技术好奇,而不是过早优化的愿望,所以请将你的告诫保持在最低限度,请。

2 个答案:

答案 0 :(得分:3)

从概念上讲,这是一种惩罚,但在实践中它是如此微不足道,以至于无关紧要;即使使用自定义颜色空间,将(例如)灰色阴影转换为RGB三元组(加上alpha)也是微不足道的算术。

当您绘制图像时,颜色空间 do 会受到惩罚,因为它不仅仅是单个转换操作的问题。必须转换每个像素,虽然这里可以进行优化(例如CLUT,颜色查找表,如果源图像使用索引颜色很有用),它们在您也找不到的情况下也不常用Quartz代码。

你说你期望CGContextSetGrayFillColor()改变图形上下文的颜色空间,但事实并非如此。这样做将需要转换该图形上下文的内容以匹配上下文的新颜色空间。因为转换颜色而不是上下文的缓冲区(例如,通过使CGContextSetGrayFillColor()成为CGContextSetRGBFillColor()周围的封闭包装器,更便宜和更简单),所以在任何明智的情况下都会避免这样的费用实施

答案 1 :(得分:1)

我一直以类似的方式广泛使用这两种方式,并注意到在性能方面没有任何惩罚。