Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как 16 битный цвет разложить на составляющие?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
011119xx
Имеется 16 битный цвет в формате 5-6-5 (RGB). Как из него получить 3 байта для каждой из составляющих?
AHTOXA
Код
R = RGB & 0x1F;
G = (RGB >> 5) & 0x3F;
B = (RGB >> 11) & 0x1F;
x736C
Здравствуйте!

То есть вам нужно преобразование 5:6:5 -> 24:24:24? Или все-таки по байту на цвет 8:8:8?


AHTOXA, скорее всего это неверное решение, если речь о преобразовании 5:6:5 -> 8:8:8.
011119xx
Нужно 8-8-8
x736C
GDI от Microsoft использует правило:

Для 5-разрядных (красный и синий) каналов, три старших бита копируются как младшие биты байта, то есть присоединяются справа к 5-битному слову. ABCDE -> ABCDE'ABC
Для 6-битного (зеленого) канала два. ABCDEF -> ABCDEF'AB

Пример:
(0x15, 0x33, 0x1D) станет (0xAD, 0xCF, 0xEF)
Красный: канал: 1 0101 -> 1010 1101.
Зеленый: 11 0011 -> 1100 1111.
Синий преобразуется так же, как и красный.

Взято отсюда: http://msdn.microsoft.com/en-us/library/wi...6(v=vs.85).aspx


Можно также масштабировать компоненты.
Например: http://ez.analog.com/thread/1205


Но можно и проще, подправив пример от AHTOXA
011119xx
Думаю правильно будет так
Код
R = (RGB >> 11) & 0x1F;
G = (RGB >> 5) & 0x3F;
B = RGB & 0x1F;

x736C
Думаю, необходимо сдвинуть каждую компоненту на 2-3 бита влево.
011119xx
Согласен
Код
R = ((RGB >> 11) & 0x1F) << 3;
G = ((RGB >> 5) & 0x3F) << 2;
B = (RGB & 0x1F) << 3;

Жаль, что значение 255 никогда не будет получено.
demiurg_spb
Цитата(011119xx @ Oct 21 2011, 10:45) *
Жаль, что значение 255 никогда не будет получено.
Ну так добейте не нулями, а единичкамиsm.gif
Или как советуют в сообщении №5.
011119xx
Тогда вот так
Код
R = (((RGB >> 11) & 0x1F) << 3) | (RGB >> 13);
G = (((RGB >> 5) & 0x3F) << 2) | ((RGB >> 8) & 0x07);
B = ((RGB & 0x1F) << 3) | ((RGB >> 2) & 0x07);
ViKo
Тогда вот так.
Код
R = RGB>>8 & 0xf8 | RGB>>13;
G = RGB>>3 & 0xfc | RGB>>9 & 0x03;
B = RGB<<3 | RGB>>2 & 0x07;
011119xx
Не согласен с G = RGB>>3 & 0xfc | RGB >> 9;
Sergey_Aleksandrovi4
Я, признаться, не уловлю смысла. Какая разница что в младшие биты каждой компоненты дописывать: нули, единицы или копировать старшие биты. Ведь в любом случае мы не можем восстановить информацию о цвете со 100% вероятностью (из 5 бит сделать 8 и при этом не ошибиться).
UPD Кажется "дошло". Чем бОльшую насыщенность имеет цвет (ближе к 0FF) тем больше будет значение младших дописываемых бит. И наоборот, чем ближе компонента к нулю, тем меньше будет дописываемая часть. Т.е. дописываемый хвостик зависит от интенсивности цвета, который в итоге на границах диапазона стремиться к 0xFF и к 0x00.
x736C
Цитата(Sergey_Aleksandrovi4 @ Oct 21 2011, 13:49) *
UPD Кажется "дошло". Чем бОльшую насыщенность имеет цвет (ближе к 0FF) тем больше будет значение младших дописываемых бит. И наоборот, чем ближе компонента к нулю, тем меньше будет дописываемая часть. Т.е. дописываемый хвостик зависит от интенсивности цвета, который в итоге на границах диапазона стремиться к 0xFF и к 0x00.

Спасибо, что объяснили, заодно и я понял. biggrin.gif
011119xx
А как максимально быстро сделать обратное преобразование, то есть из R, G, B получить 16 битный RGB?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.