我已经掌握了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);
}
Run Code Online (Sandbox Code Playgroud)
但是,这没有我想要的一个属性,而是用于0xffff映射到0xffffff,而不是0xf8fcf8.我需要以某种方式扩展价值,但我不确定这应该如何运作.
Android SDK附带了一个名为ddms(Dalvik Debug Monitor)的工具,可以捕获屏幕截图.据我所知,通过阅读代码,它实现了相同的逻辑; 但它的截图不同,白色映射为白色.
这是原始帧缓冲,ddms 的智能转换,以及上述算法的哑转换.请注意,后者稍微更暗,更绿.
(顺便说一下,这个转换是在ffmpeg中实现的,但它只是执行上面列出的哑转换,使LSB全部为零.)
我想我有两个问题: