Есть ли штраф за смешивание цветовых пространств? (Основная графика)
Если я пишу код для рисования в 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 ответа
Концептуально, есть наказание, но на практике оно настолько незначительно, что не имеет значения; преобразование (например) оттенка серого в триплет RGB (плюс альфа) является тривиальной арифметикой даже с пользовательским цветовым пространством.
Однако при рисовании изображений цветовые пространства имеют штраф, так как это больше, чем просто операция преобразования. Каждый пиксель должен быть преобразован, и хотя здесь можно выполнить оптимизацию (например, CLUT, таблицы соответствия цветов, полезны, если исходное изображение использует индексированные цвета), они не являются полезными в ситуациях, когда вы также находите Кварцевый код.
Вы говорите, что ожидаете CGContextSetGrayFillColor()
изменить цветовое пространство графического контекста, но на самом деле это не так. Для этого потребуется преобразовать содержимое этого графического контекста в соответствии с новым цветовым пространством контекста. Поскольку преобразование цвета вместо буферов контекста намного дешевле и проще (например, путем CGContextSetGrayFillColor()
обертка под одеялом вокруг CGContextSetRGBFillColor()
), такого расхода можно избежать в любой разумной реализации.
Я широко использовал оба метода одинаково и не заметил никаких проблем с точки зрения производительности.