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 ;
}
我要做的工作是在画板上涮上一层底色,使用的是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 ;
}
相关文章推荐
- RGB565 与 RGB888的相互转换
- RGB565 与 RGB888的相互转换
- RGB565,RGB888
- RGB888转RGB565
- RGB888->RGB565->RGB888
- RGB565颜色表,附RGB888转RGB565工具,RGB24转RGB565工具
- S3C6410 FramBuffer编程(四) --- RGB565、RGB24简介,以及RGB565转换为RGB24
- RGB565 & RGB888
- RGB888转RGB565,wince BMP控件显示位图
- JAVA中颜色RGB888转RGB565的简单方法
- RGB888和565相互转换
- RGB565 与RGB888的区别
- RGB888->RGB565->RGB888
- RGB565 与RGB888的区别
- S3C6410 FramBuffer编程(四) --- RGB565、RGB24简介,以及RGB565转换为RGB24
- RGB565 与RGB888的区别
- RGB888转RGB565
- RGB565->RGB888
- RGB888->RGB565
- bmp提取rgb888转换成yuv格式中的yv12再从yv12转换为rgb888写成bmp格式文件的工程,测试通过