Извлечение цветовых компонентов RGB из целочисленного значения - PullRequest
2 голосов
/ 26 февраля 2010

, если есть целочисленное значение, например. 86 тогда как я могу извлечь компоненты r, g, b из этого целочисленного значения ....? Я работаю над Visual C ++ 2008 Express Edition. Спасибо ..

Ответы [ 2 ]

11 голосов
/ 26 февраля 2010

Обычно (и я повторяю обычно, поскольку вы не указываете много в своем вопросе) цвет упаковывается в 4-байтовое целое число с компонентами RGBA.

Что вам нужно сделать, это маска и смещение, например:

int color = 0xRRGGBBAA;

u8 red = (color & 0xFF000000) >> 24;
u8 green = (color & 0x00FF0000) >> 16;
u8 blue = (color & 0x0000FF00) >> 8;

Это предполагает тип кодировки, который я указал, но может быть изменен в соответствии с вашим.

EDIT: В вашем примере вы говорили о значении 0-255. Неясно, имеют ли компоненты размер 2 бита (4 значения интенсивности на компонент).

В этом случае подход остается прежним, но у вас будет всего несколько цветов:

u8 color = 86;

// so you take 2 bits and multiply by 64 to possibly have intensities: 0, 64, 128, 192
u8 red = ((color & 0xC0) >> 6) * 64; 
u8 green = ((color & 0x30) >> 4) * 64;
u8 blue = ((color & 0x0C) >> 2) * 64;

EDIT2: Возможно, ваши цвета индексируются с помощью палитры, в этом случае у вас должен быть массив, в котором хранится сама палитра, а байт, который вы читаете из файла, должен быть индексом цвета, сохраненного где-то еще. .

0 голосов
/ 26 февраля 2010

Обычно вы хотите создать цвет из трех компонентов, используя макрос RGB. Предполагая, что у вас есть значение в том же формате, вы можете разделить его на отдельные части с помощью GetRValue, GetGValue и GetBValue.

...