我已经得到了16位rgb565图像(具体来说,Android帧缓冲转储)的手,我想将它转换为24位rgb888以便在普通显示器上查看。如何将16位RGB565转换为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
映射,而不是0xf8fcf8
到0xffffff
。我需要以某种方式扩大价值,但我不确定这应该如何工作。
Android SDK带有一个名为ddms(Dalvik Debug Monitor)的工具,它可以捕获屏幕。据我从reading the code可以看出,它实现了相同的逻辑;但其截图出现了不同,白色映射到白色。
这里的raw framebuffer,smart conversion ddms和dumb conversion通过上述算法。请注意后者稍暗,更绿。
(顺便说一句,这种转换is implemented in ffmpeg,但它只是执行上面列出的哑转换,在所有零离开的LSB)
我想我有两个问题:
- 有什么最明智的方式将rgb565转换为rgb888?
- DDMS如何转换其截图?
是的,这正是他们正在做的。我认为这实际上是*最*线性映射。 – 2010-03-14 15:37:08
截断乘以8.25,而截尾乘以不同的舍入值。无论哪种方式,有7个“步骤”,在该步骤中,将1加到输入上,而不是8中输出。我想你可以根据步骤发生的位置来定义“缺少线性” - 8段输入,也许?或者计算所有32个输入与其输出的相关系数,最大结果为“最线性”。 – 2010-03-14 16:37:48