一尘不染

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

algorithm

我已经准备好使用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。我需要以某种方式扩大价值,但我不确定如何运作。

Android
SDK附带了一个名为ddms(Dalvik调试监视器)的工具,该工具可进行屏幕捕获。据我阅读代码所知,它实现了相同的逻辑。但其屏幕截图却有所不同,白色正映射为白色。

这是原始帧缓冲区,ddms
智能转换和上述算法的哑转换。请注意,后者稍深一些和绿色一些。

(顺便说一下,此转换是在ffmpeg中实现的,但它只是执行上面列出的哑转换,而LSB都为零。)

我想我有两个问题:

  • 将rgb565转换为rgb888的最明智的方法是什么?
  • DDMS如何转换其屏幕截图?

阅读 381

收藏
2020-07-28

共1个答案

一尘不染

您可以先移位然后再移位最高有效位;即

Red 10101 becomes 10101000 | 101 => 10101101
    12345         12345---   123    12345123

它具有您要寻找的属性,但这不是从一个空间到另一个空间的最线性的值映射。不过速度很快。:)

Cletus的答案更完整,甚至可能更好。:)

2020-07-28