Есть ли штраф за смешивание цветовых пространств? (Основная графика) - PullRequest
5 голосов
/ 27 января 2010

Если я пишу код рисования в Core Graphics в Mac OS X или iPhone OS, я могу установить активный цвет заливки на красный, вызвав:

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 ]

3 голосов
/ 06 июля 2010

Концептуально, есть наказание, но на практике оно настолько незначительно, что не имеет значения; преобразование (например, оттенка серого в триплет RGB (плюс альфа) тривиальной арифметики даже с пользовательским цветовым пространством.

Цветовые пространства do имеют штраф за рисование изображений, поскольку это больше, чем просто операция преобразования. Каждый пиксель должен быть преобразован, и хотя здесь можно выполнить оптимизацию (например, CLUT, таблицы соответствия цветов, полезны, если исходное изображение использует индексированные цвета), они не являются полезными в ситуациях, когда вы также находите Кварцевый код.

Вы говорите, что ожидаете CGContextSetGrayFillColor(), чтобы изменить цветовое пространство графического контекста, но на самом деле это не так. Для этого потребуется преобразовать содержимое этого графического контекста в соответствии с новым цветовым пространством контекста. Поскольку преобразовать цвет вместо буферов контекста гораздо дешевле и проще (например, сделав CGContextSetGrayFillColor() оболочкой «под прикрытием» вокруг CGContextSetRGBFillColor()), таких затрат можно избежать в любой разумной реализации.

1 голос
/ 10 марта 2010

Я широко использовал оба метода одинаково и не заметил никаких штрафов с точки зрения производительности.

...