专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > 图形/图像

哪个朋友可以帮忙解答一下RGB565转RGB888的函数(位运算)?解决思路

发布时间:2011-06-27 20:40:24 文章来源:www.iduyao.cn 采编人员:星星草
哪个朋友可以帮忙解答一下RGB565转RGB888的函数(位运算)??
C/C++ code

struct PIXEL
{
    unsigned char R;
    unsigned char G;
    unsigned char B;
    unsigned char A;
};

PIXEL RGB565to888(unsigned short color, unsigned char Alpha)
{
    PIXEL pixel;
    unsigned int r = (color>>11) & 0x1f;
    unsigned int g = (color>> 5) & 0x3f;
    unsigned int b = (color    ) & 0x1f;

    pixel.A = Alpha;
    pixel.R = (r<<3) | (r>>2);   // 就是这个地方我看不明白,为什么这么算就能转成8位的值了。
    pixel.G = (g<<2) | (g>>4);
    pixel.B = (b<<3) | (b>>2);

    return pixel;
}



函数的功能是将一个r5g6b5的颜色值转换成r8g8b8的值,
如:在r5g6b5里rgb的值可能是:r:22 g:52 b:15 在8位下就应该是:r:180 g:210 b:123
代码中我不明白的地方,如果是我自己算的话,我可能是将r g b分别除以31然后再乘以255,但它仅用了3个位运算就可以算出来了,我实在看不明白,有朋友知道么?

------解决方案--------------------
5位变8位就在后面添3个0喽,这不就是左移3位嘛,他还或个右移是为了让转过的图像看起来更自然一些吧。
------解决方案--------------------
探讨
5位变8位就在后面添3个0喽,这不就是左移3位嘛,他还或个右移是为了让转过的图像看起来更自然一些吧。

------解决方案--------------------
假设color = "00011 010101 11000" //(x,y,z)的格式

color>>11= "00000 000000 00011" //(0,0,x)
0x1f = "00000 000000 11111"
r = "00000 000000 00011" //x

color>>5 = "00000 00011 010101" //(0,x,y)
0x3f = "00000 00000 111111"
g = "00000 00000 010101" //y

color = "00011 010101 11000" //(x,y,z)
0x1f = "00000 000000 11111"
b = "00000 000000 11000" //z

所以r,g,b=x,y,z,然后把r和b从5bit拉到8bit,所以左移3位,g只要左移2位。
out.x = r << 3
out.y = g << 2
out.z = b << 3
但是左移出来的3(2)个0可能不太好,形成了误差,
比如b = “11000”,为了弥补可能的误差,我们用b的前3位弥补b左移3位形成的3个0
b<<3 = "11000 000"
b<<2 = "00000 110"
或起来就是"11000 110",这样的好处就是"11111"变成了"11111 111"也就是255,而不是"11111 000"248
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: