Преобразовать значение в градациях серого в представление RGB? - PullRequest
20 голосов
/ 07 мая 2009

Как я могу преобразовать значение в градациях серого (0-255) в значение / представление RGB? Он предназначен для использования в SVG-изображении, которое, похоже, не имеет поддержки оттенков серого, только RGB ...

Примечание: это не RGB -> оттенки серого, на который уже дан ответ в другом вопросе, например Преобразование RGB в оттенки серого / интенсивность )

Ответы [ 6 ]

28 голосов
/ 07 мая 2009

Быстрый и грязный подход - повторить интенсивность оттенков серого для каждого компонента RGB. Итак, если у вас есть шкала серого 120, она переводится в RGB (120, 120, 120).

Это быстро и грязно, потому что эффективная яркость зависит от фактической яркости субпикселей R, G и B используемого вами устройства.

27 голосов
/ 13 августа 2009

Если у вас есть значение шкалы серого в переменной и вы хотите создать новое значение в форме 0x00RRGGBB, быстрый способ сделать это:

int rgb = grey * 0x00010101;

или эквивалент на выбранном вами языке.

9 голосов
/ 07 мая 2009

Преобразование градаций серого в RGB просто. Просто используйте R = G = B = значение серого. Основная идея заключается в том, что цвет (если смотреть на монитор в терминах RGB) является аддитивной системой.

http://en.wikipedia.org/wiki/Additive_color

Таким образом, добавление красного к зеленому дает желтый. Добавьте немного синего к этой смеси в равных количествах, и вы получите нейтральный цвет. Полный [красный, зеленый, синий] = [255 255 255] дает белый цвет. [0,0,0] дает монитор черного цвета. Промежуточные значения, когда все R = G = B равны, дают номинально нейтральные цвета данного уровня серого.

Небольшая проблема зависит от того, как вы видите цвет, он может быть не совсем нейтральным. Это будет зависеть от того, как откалиброван ваш монитор (или принтер). Есть интересные глубины науки о цвете, которые мы могли бы изучить с этого момента. Я остановлюсь здесь.

7 голосов
/ 07 мая 2009

Серая шкала означает, что все значения имеют одинаковую интенсивность. Установите все каналы (в RGB) равными значению серого, и вы получите черно-белое изображение RGB.

4 голосов
/ 07 мая 2009

Не установите ли R, G и B одно и то же значение (значение шкалы серого) для каждого пикселя, чтобы получить правильный оттенок серого?

0 голосов
/ 30 августа 2013

Вы также можете взглянуть на мое решение. Оптимизированный для более быстрой сборки способ преобразования изображения RGB8 в изображение RGB32 . Серый канал просто повторяется во всех остальных каналах.

Цель состояла в том, чтобы найти быстрое возможное решение для конвертации с использованием x86 / SSE.

...