我手上有一个16位的rgb565镜像(具体来说是一个Android framebuffer转储),我想把它转换成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)的工具,可以进行屏幕截图。据我所知,从reading the code年起,它实现了相同的逻辑;但它的截图不同,而白色的映射到白色。
这里是raw framebuffer,smart conversion由ddms和dumb conversion通过上述算法。请注意,后者稍微深一点。
(顺便说一句,这个转换is implemented in ffmpeg,但它只是执行上面列出的哑变换,将LSB置零)。
我想我有两个问题:
>将rgb565转换为rgb888最合理的方法是什么?
> DDMS如何转换其截图?
解决方法
你可以移动,然后或者最高有效位;即
Red 10101 becomes 10101000 | 101 => 10101101 12345 12345--- 123 12345123
这具有您寻求的属性,但它不是从一个空间到另一个空间的值的最线性映射。虽然如此,