首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 平面设计 > 图形图像 >

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

2012-02-08 
哪个朋友可以帮忙解答一下RGB565转RGB888的函数(位运算)??C/C++ codestruct PIXEL{unsigned char Runsign

哪个朋友可以帮忙解答一下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

热点排行