哪个朋友可以帮忙解答一下RGB565转RGB888的函数(位运算)??C/C++ codestruct PIXEL{unsigned char Runsign
哪个朋友可以帮忙解答一下RGB565转RGB888的函数(位运算)??
C/C++ codestruct 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位嘛,他还或个右移是为了让转过的图像看起来更自然一些吧。
[解决办法][解决办法]假设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