c - RGB888 到 RGB565/位移位

标签 c bit-manipulation rgb

我想使用位移将三个字符组合成一个短片。这是为了实现 RGB565 调色板(红色有 5 位,绿色有 6 位,蓝色有 5 位)。

这是我的示例程序,我只是错过了中间的一步,我认为我需要做一些事情。

#include <stdio.h>

int main( ){
        unsigned char r, g, b;
        unsigned short rgb;

        r = 255;        // 0xFF 1111 1111
        g = 100;        // 0x64 0110 0100
        b = 50;         // 0x32 0011 0010

        r = r >> 3;     // 0x31 0001 1111
        g = g >> 2;     // 0x19 0001 1001
        b = b >> 3;     // 0x06 0000 0110

        //r = r & something; //
        //g = g & something; //
        //b = b & something; //

        // Desired result:
        //          R      G     B
        // 0xFB26 11111 011001 00110
        rgb = r | g | b;

        printf( "r 0x%x g 0x%x b 0x%x, rgb 0x%08x\n", r, g, b, rgb );
}

最后你可以看到我想要的结果。感谢您的帮助!

最佳答案

rgb = ((r & 0b11111000) << 8) | ((g & 0b11111100) << 3) | (b >> 3);

我们将 r 左移 11 位,g 左移 5 位,然后将它们与 b 右移 3 位按位或。 (注意:这假定值已经被正确屏蔽,如果需要的话,以删除任何不需要的位。)

关于c - RGB888 到 RGB565/位移位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11471122/

相关文章:

python - 如何在 Python 中优化 str.replace()

c++ - 我可以在 C++ 中输入/输出位吗

php - 如何使用 PHP 制作颜色较浅的版本?

java - 图像像素替换

c - SCCS "what"字符串未被编译器优化掉

c++ - 使用/不使用内在函数填充 C++

c - UI 凭证弹出窗口隐藏在服务窗口后面

python - Python 整数不受 32 位或 64 位大小的限制意味着什么?

c - 共享内存未更新

java - 在 Java 和 PHP 中获取 RGB 有不同的结果