Как преобразовать 24-битный RGB в 8-битный RGB

Мне было интересно, как лучше всего преобразовать 24-битный цвет RGB (8 бит на цвет) в 8-битный цвет (2 бита синего, 3 зеленого, 3 красного). Мне нужен код C для этого.


person Gootik    schedule 05.10.2011    source источник
comment
Пожалуйста, добавьте информацию о языке программирования и/или цветовом представлении.   -  person Alin Purcaru    schedule 05.10.2011


Ответы (3)


8-битный RGB обычно представляет собой индексированный (палитрованный) цветовой формат, см. Palette (вычисления).

Однако, как вы это описали, получить 8 бит на пиксель из 24 бит на пиксель довольно просто - вам нужно будет удалить младшие значащие биты и объединить биты в однобайтовое значение для каждого пикселя. Насколько я знаю, это не стандартное или общеизвестное представление цвета пикселей.

person Roman R.    schedule 05.10.2011
comment
Вы уверены, что должны отбрасывать менее значащие байты вместо аппроксимации? - person Alin Purcaru; 05.10.2011
comment
Есть варианты, такие как дизеринг. Самый простой для понимания и реализации — отбросить биты и уменьшить детализацию, чтобы уложиться в фиксированное количество битов. Изменения вдобавок к этому заключаются в том, чтобы добавить больше шума, но оставить лучшее субъективное качество. В любом случае, я готов поспорить, что если OP сделает один шаг назад, чтобы прояснить вопрос, появится формат индексированного цвета. - person Roman R.; 05.10.2011

Не на С, а на JavaScript.

encodedData = (Math.floor((red / 32)) << 5) + (Math.floor((green / 32)) << 2) + Math.floor((blue / 64));

https://stackoverflow.com/a/25258278/2130509

person Jai    schedule 12.08.2014

Чтобы преобразовать 8-битное [0 - 255] значение в 3-битное [0, 7], 0 не проблема, но помните, что 255 нужно преобразовать в 7, поэтому формула должна быть Red3 = Red8 * 7/255.

Чтобы преобразовать 24-битный цвет в 8-битный (RRRGGGBB),

8bit Color = (Red * 7 / 255) << 5 + (Green * 7 / 255) << 2 + (Blue * 3 / 255)
person Mingjie Li    schedule 17.06.2016