5

如果我在 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方法,强度值被复制了3次;相反,它将上下文的颜色空间从 DeviceRGB 更改为 DeviceGray。下一次调用 RGB 方法会将其切换回来。

我很想知道:

  • 切换色彩空间的惩罚是什么?
  • 当您的上下文的色彩空间与您设备的本机色彩空间不匹配时,绘图会受到惩罚吗?(即,在 DeviceGray 与 DeviceRGB 中绘图)

我是出于对技术的好奇,而不是过早优化的愿望,所以请尽量减少您的警告。

4

2 回答 2

3

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

但是,当您绘制图像时,色彩空间确实会受到影响,因为这不仅仅是一次转换操作的问题。每个像素都必须进行转换,虽然可以在此处进行优化(例如 CLUT、颜色查找表,如果源图像使用索引颜色时很有用),但它们在您还发现的情况下往往没有用处石英码。

您说您希望CGContextSetGrayFillColor()更改图形上下文的颜色空间,但实际上并非如此。这样做需要转换该图形上下文的内容以匹配上下文的新颜色空间。由于转换颜色而不是上下文的缓冲区更便宜和更简单(例如,通过CGContextSetGrayFillColor()在 周围制作一个幕后包装器CGContextSetRGBFillColor()),因此在任何明智的实现中都将避免这种费用。

于 2010-07-06T03:46:54.933 回答
1

我一直以类似的方式广泛使用这两种方法,并且没有注意到性能方​​面的任何损失。

于 2010-03-10T08:04:14.523 回答