您的位置:首页 > 其它

rgb888与rgb565转换的影响

2014-11-19 12:23 302 查看
在公司项目里发现了RGB888与RGB565转换出现的问题:

我要做的工作是在画板上涮上一层底色,使用的是OpenGL里的glClearColor()函数,从文件中读出的颜色值是0x00c0c0d0[0, 192, 192, 208],以unsigned int接收,以除以255.0f来提取RGB的值,最后通过glClearColor(R,G,B,A)刷上底色。之后再贴上图片,关键在底色和图片中的背景颜色值是相同的,都是0x00c0c0d0,最后描画出来这两部分颜色上有明显不同,截图取颜色值发现底色是[189, 190, 206],图片上背景是[198, 195,
214]明显图片的背景偏差比较大,后来请教了别人之后,知道造成这种现象的原因就是因为RGB888与RGB565转换过程中精度的丢失造成的~我的颜色值精度丢失是在除以255.0f时造成的,而图片是通过OpenGL的纹理生成图片过程中经过了RGB888与RGB565的转换造成较大的精度丢失。这里贴上两者转换原理:

1、24bit RGB888 到 16bit RGB565 的色彩转换-->这过程属于位数的压缩,造成精度的丢失

转换的原理是24bit RGB888取高位填16bit RGB565的位数,如:

24bit RGB888:R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0

16bit RGB565:R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 G1 B7 B6 B5 B4 B3

2、16bit RGB565 -> 24bit RGB888 的转换-->空缺部分 由0填补

16bit RGB656 R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0

24ibt RGB888 R4 R3 R2 R1 R0 0 0 0 G5 G4 G3 G2 G1 G0 0 0 B4 B3 B2 B1 B0 0 0 0

代码实例:

1、24bit RGB888 到 16bit RGB565

bit16 rgb888_to_rgb565(bit32 rgb888)

{

bit16 r = (rgb888 & 0x00FF0000) >> 19;

bit16 g = (rgb888 & 0x0000FF00) >> 10;

bit16 b = (rgb888 & 0x000000FF) >> 3;

return ((r << 11) | (g << 5) | b) ;

}\

2、16bit RGB565 -> 24bit RGB888

bit32 rgb565_2_rgb888(bit16 rgb565)

{

// 1,

UInt32 r = (rgb565 & 0xF800) >> 11;

UInt32 g = (rgb565 & 0x07E0) >> 5;

UInt32 b = rgb565 & 0x001F;

// 2,

r = r << 3 | r >> 2;

g = g << 2 | g >> 4;

b = b << 3 | b >> 2;

return r << 16 | g << 8 | b ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: