rgb888与rgb565转换的影响

来源:互联网 发布:图解网络硬件 kindle 编辑:程序博客网 时间:2024/04/30 19:44

在公司项目里发现了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 ;
        }

 

 

 

0 0
原创粉丝点击