如果我在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方法会将其切换回来。
我很想知道:
我要求技术好奇,而不是过早优化的愿望,所以请将你的告诫保持在最低限度,请。
答案 0 :(得分:3)
从概念上讲,这是一种惩罚,但在实践中它是如此微不足道,以至于无关紧要;即使使用自定义颜色空间,将(例如)灰色阴影转换为RGB三元组(加上alpha)也是微不足道的算术。
当您绘制图像时,颜色空间 do 会受到惩罚,因为它不仅仅是单个转换操作的问题。必须转换每个像素,虽然这里可以进行优化(例如CLUT,颜色查找表,如果源图像使用索引颜色很有用),它们在您也找不到的情况下也不常用Quartz代码。
你说你期望CGContextSetGrayFillColor()
改变图形上下文的颜色空间,但事实并非如此。这样做将需要转换该图形上下文的内容以匹配上下文的新颜色空间。因为转换颜色而不是上下文的缓冲区(例如,通过使CGContextSetGrayFillColor()
成为CGContextSetRGBFillColor()
周围的封闭包装器,更便宜和更简单),所以在任何明智的情况下都会避免这样的费用实施
答案 1 :(得分:1)
我一直以类似的方式广泛使用这两种方式,并注意到在性能方面没有任何惩罚。