Я получил 16-битное изображение rgb565 (в частности, дамп фейерверка Android), и я хотел бы преобразовать его в 24-разрядный rgb888 для просмотра на обычном мониторе.
Вопрос в том, как преобразовать 5- или 6-битный канал в 8 бит? Очевидный ответ - сдвинуть его. Я начал писать:
puts("P6 320 480 255");
uint16_t buf;
while (read(0, &buf, sizeof buf)) {
unsigned char red = (buf & 0xf800) >> 11;
unsigned char green = (buf & 0x07e0) >> 5;
unsigned char blue = buf & 0x001f;
putchar(red << 3);
putchar(green << 2);
putchar(blue << 3);
}
Однако у этого не есть одно свойство, которое я хотел бы, что для 0xffff
для отображения в 0xffffff
вместо 0xf8fcf8
. Мне нужно каким-то образом расширить значение, но я не уверен, как это должно работать.
Android SDK поставляется с инструментом под названием ddms (Dalvik Debug Monitor), который берет захват экрана. Насколько я могу судить из читает код, он реализует ту же логику; но его скриншоты выделяются разными, а белый - белым.
Heres raw framebuffer, интеллектуальное преобразование на ddms и немой конверсии по вышеуказанному алгоритму. Обратите внимание, что последний немного темнее и зеленее.
(Кстати, это преобразование реализовано в ffmpeg, но оно просто выполняет немое преобразование, перечисленное выше, оставляя LSB на всех ноль.)
У меня есть два вопроса:
- Какой самый разумный способ конвертировать rgb565 в rgb888?
- Как DDMS конвертирует свои скриншоты?