我已经准备好使用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。我需要以某种方式扩大价值,但我不确定如何运作。
0xffff
0xffffff
0xf8fcf8
Android SDK附带了一个名为ddms(Dalvik调试监视器)的工具,该工具可进行屏幕捕获。据我阅读代码所知,它实现了相同的逻辑。但其屏幕截图却有所不同,白色正映射为白色。
这是原始帧缓冲区,ddms 的智能转换和上述算法的哑转换。请注意,后者稍深一些和绿色一些。
(顺便说一下,此转换是在ffmpeg中实现的,但它只是执行上面列出的哑转换,而LSB都为零。)
我想我有两个问题:
您可以先移位然后再移位最高有效位;即
Red 10101 becomes 10101000 | 101 => 10101101 12345 12345--- 123 12345123
它具有您要寻找的属性,但这不是从一个空间到另一个空间的最线性的值映射。不过速度很快。:)
Cletus的答案更完整,甚至可能更好。:)