算法 – 如何将16位RGB565转换为24位RGB888?

前端之家收集整理的这篇文章主要介绍了算法 – 如何将16位RGB565转换为24位RGB888?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我手上有一个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 framebuffersmart conversion由ddms和dumb conversion通过上述算法。请注意,后者稍微深一点。

(顺便说一句,这个转换is implemented in ffmpeg,但它只是执行上面列出的哑变换,将LSB置零)。

我想我有两个问题:

>将rgb565转换为rgb888最合理的方法是什么?
> DDMS如何转换其截图?

解决方法

你可以移动,然后或者最高有效位;即
Red 10101 becomes 10101000 | 101 => 10101101
    12345         12345---   123    12345123

这具有您寻求的属性,但它不是从一个空间到另一个空间的值的最线性映射。虽然如此,

猜你在找的CSS相关文章