реклама на сайте
подробности

 
 
> Как 16 битный цвет разложить на составляющие?
011119xx
сообщение Oct 21 2011, 04:29
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Имеется 16 битный цвет в формате 5-6-5 (RGB). Как из него получить 3 байта для каждой из составляющих?

Сообщение отредактировал 011119xx - Oct 21 2011, 04:30
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 14)
AHTOXA
сообщение Oct 21 2011, 05:31
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Код
R = RGB & 0x1F;
G = (RGB >> 5) & 0x3F;
B = (RGB >> 11) & 0x1F;


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
x736C
сообщение Oct 21 2011, 05:34
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Здравствуйте!

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


AHTOXA, скорее всего это неверное решение, если речь о преобразовании 5:6:5 -> 8:8:8.

Сообщение отредактировал x736C - Oct 21 2011, 05:44
Go to the top of the page
 
+Quote Post
011119xx
сообщение Oct 21 2011, 05:42
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Нужно 8-8-8
Go to the top of the page
 
+Quote Post
x736C
сообщение Oct 21 2011, 05:59
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



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

Сообщение отредактировал x736C - Oct 21 2011, 06:01
Go to the top of the page
 
+Quote Post
011119xx
сообщение Oct 21 2011, 06:15
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



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

Go to the top of the page
 
+Quote Post
x736C
сообщение Oct 21 2011, 06:23
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Думаю, необходимо сдвинуть каждую компоненту на 2-3 бита влево.
Go to the top of the page
 
+Quote Post
011119xx
сообщение Oct 21 2011, 06:45
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Согласен
Код
R = ((RGB >> 11) & 0x1F) << 3;
G = ((RGB >> 5) & 0x3F) << 2;
B = (RGB & 0x1F) << 3;

Жаль, что значение 255 никогда не будет получено.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 21 2011, 06:51
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(011119xx @ Oct 21 2011, 10:45) *
Жаль, что значение 255 никогда не будет получено.
Ну так добейте не нулями, а единичкамиsm.gif
Или как советуют в сообщении №5.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
011119xx
сообщение Oct 21 2011, 07:34
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Тогда вот так
Код
R = (((RGB >> 11) & 0x1F) << 3) | (RGB >> 13);
G = (((RGB >> 5) & 0x3F) << 2) | ((RGB >> 8) & 0x07);
B = ((RGB & 0x1F) << 3) | ((RGB >> 2) & 0x07);
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 21 2011, 07:56
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Тогда вот так.
Код
R = RGB>>8 & 0xf8 | RGB>>13;
G = RGB>>3 & 0xfc | RGB>>9 & 0x03;
B = RGB<<3 | RGB>>2 & 0x07;
Go to the top of the page
 
+Quote Post
011119xx
сообщение Oct 21 2011, 08:15
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



Не согласен с G = RGB>>3 & 0xfc | RGB >> 9;
Go to the top of the page
 
+Quote Post
Sergey_Aleksandr...
сообщение Oct 21 2011, 09:49
Сообщение #13


Частый гость
**

Группа: Свой
Сообщений: 168
Регистрация: 8-10-08
Из: РФ Смоленск
Пользователь №: 40 764



Я, признаться, не уловлю смысла. Какая разница что в младшие биты каждой компоненты дописывать: нули, единицы или копировать старшие биты. Ведь в любом случае мы не можем восстановить информацию о цвете со 100% вероятностью (из 5 бит сделать 8 и при этом не ошибиться).
UPD Кажется "дошло". Чем бОльшую насыщенность имеет цвет (ближе к 0FF) тем больше будет значение младших дописываемых бит. И наоборот, чем ближе компонента к нулю, тем меньше будет дописываемая часть. Т.е. дописываемый хвостик зависит от интенсивности цвета, который в итоге на границах диапазона стремиться к 0xFF и к 0x00.

Сообщение отредактировал Sergey_Aleksandrovi4 - Oct 21 2011, 09:57
Go to the top of the page
 
+Quote Post
x736C
сообщение Oct 21 2011, 10:30
Сообщение #14


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Цитата(Sergey_Aleksandrovi4 @ Oct 21 2011, 13:49) *
UPD Кажется "дошло". Чем бОльшую насыщенность имеет цвет (ближе к 0FF) тем больше будет значение младших дописываемых бит. И наоборот, чем ближе компонента к нулю, тем меньше будет дописываемая часть. Т.е. дописываемый хвостик зависит от интенсивности цвета, который в итоге на границах диапазона стремиться к 0xFF и к 0x00.

Спасибо, что объяснили, заодно и я понял. biggrin.gif
Go to the top of the page
 
+Quote Post
011119xx
сообщение Oct 24 2011, 02:30
Сообщение #15


Местный
***

Группа: Свой
Сообщений: 381
Регистрация: 5-07-05
Из: Уфа
Пользователь №: 6 544



А как максимально быстро сделать обратное преобразование, то есть из R, G, B получить 16 битный RGB?
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 14:43
Рейтинг@Mail.ru


Страница сгенерированна за 0.01495 секунд с 7
ELECTRONIX ©2004-2016