如果我在 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 进行绘制)
我问这个问题是出于技术上的好奇心,而不是过早优化的愿望,所以请尽量减少你的警告。
最佳答案
从概念上讲,这是有惩罚的,但实际上它很小,以至于无关紧要;即使使用自定义颜色空间,将(例如)灰色阴影转换为 RGB 三元组(加上 alpha)也是微不足道的算术。
但是,当您绘制图像时,颜色空间确实会受到影响,因为它不仅仅是单个转换操作的问题。每个像素都必须进行转换,虽然可以在此处进行优化(例如 CLUT、颜色查找表,如果源图像使用索引颜色,则非常有用),但它们在您还发现的情况下往往没有用处。 quartz 代码。
你说你期待CGContextSetGrayFillColor()
更改图形上下文的颜色空间,但实际情况并非如此。这样做需要转换该图形上下文的内容以匹配上下文的新颜色空间。由于转换颜色而不是上下文的缓冲区要便宜得多且简单得多(例如,通过将 CGContextSetGrayFillColor()
制作为 CGContextSetRGBFillColor()
的幕后包装器),因此在任何明智的实现中都将避免这种费用。 p>
关于iphone - 混合颜色空间有惩罚吗? (核心显卡),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2143645/