2009-07-28 2 views
1

У меня есть 16-битное значение яркости, сохраненное в двух байтах, и я хочу преобразовать его в значения R, G и B. У меня есть два вопроса: как преобразовать эти два байта в короткий, и предположив, что оттенок и насыщенность равны 0, как мне превратить это короткое число в 8 бит на компонентные значения RGB?Преобразование 16-битного значения яркости в 32-разрядное RGB

(Класс Convert не имеет возможности взять два байта и выводился коротким.)

ответ

2

Если 16-битное значение малое и малознаковое, второй байт будет тем, который вы хотите повторить 3x, чтобы создать значение RGB, и вы отбросите другой байт. Или, если вы хотите RGB в 32-битном целочисленном значении, вы можете либо использовать сдвиги бит, либо добавлять или просто умножать этот 2-й байт на 0x10101.

+0

Это именно то, что мне нужно спасибо! – RCIX

2

Попробуйте что-то вроде этого:

byte luminance_upper = 23; 
byte luminance_lower = 57; 
int luminance = ((int)luminance_upper << 8) | (int)luminance_lower; 

Это даст вам значение между 0-65535 ,

Конечно, если вы просто хотите получить 32-битный цвет ARGB (оттенок серого), нижний байт не будет иметь значения, потому что вы переходите от 16-разрядной яркости к 8-битовому R , G, B.

byte luminance_upper = 255; 
// assuming ARGB format 
uint argb = (255u << 24)      // alpha = 255 
      | ((uint)luminance_upper << 16) // red 
      | ((uint)luminance_upper << 8) // green 
      | (uint)luminance_upper;   // blue (hope my endianess is correct) 

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

+0

Под «32-битным оттенком серого» он означает «альфа, R, G, B, где каждый из 8 бит и R = G = B». – Crashworks

+0

yep, надеюсь, что сейчас немного яснее. – geofftnz

0

Вам понадобятся и другие компоненты (оттенок и насыщенность).

Кроме того, 16-битные звуки немного странные. Обычно эти значения являются плавающей запятой.

В CodeProject есть очень хорошая статья для конверсий многих цветовых пространств.

Смежные вопросы