Существует ли штраф за смешивание цветовых пространств? (Базовая Графика)

Если я пишу код для прорисовки в Базовой Графике на 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)

Я спрашиваю из технического любопытства, не требования преждевременно оптимизировать, поэтому сведите свои замечания к минимуму.

5
задан benzado 27 January 2010 в 00:02
поделиться

2 ответа

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

1
ответ дан 15 December 2019 в 01:01
поделиться

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

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

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

3
ответ дан 15 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: