真彩色是指图像中的每个像素值都分成R(红)、G(绿)、B(蓝)三个基色分量,每个基色分量直接决定其基色的强度,这样产生的色彩称为彩色。彩色图像是一种用三个或更多字节描述像素的计算机图像存储方式。
普遍认为人眼对色彩的分辨能力大致是一千万色,因此由RGB888形成的图像称作真彩色。RGB888真彩色,每一色光以8位表示,每个通道各有256级阶调,三色光交互增减,RGB三色光能在一个像素上最高显示24位1677万色(256*256*256=16,777,216),这个数值就是电脑中所能表示的最高色彩。
RGB332(3+3+2=8位色):(2^3)*(2^3)*(2^2) = 8*8*4 = 256(256 Color).俗称256色。
RGB555(5+5+5=15位色):(2^5)*(2^5)*(2^5) = 32*32*32 = 32768(32768/1024 = 32,32K Color),俗称32千色。
RGB565(5+6+5=16位色 ):(2^5)*(2^6)*(2^5) = 32*64*32 = 65536(65536/1024 = 64,64K Color),俗称65千色。
RGB666(6+6+6=18位色):(2^6)*(2^6)*(2*6) = 64*64*64 = 262144(262144/1024 = 256, 256K Color).俗称262千色.
RGB888(8+8+8=24位色):(2^8)*(2^8)*(2^8) = 256*256*256 = 16777216(16777216/1024 = 16384,16384K Color ; 16384/1024 = 16 , 16M Color。) 俗称16兆真彩色。
RGB888+8(8+8+8+8=32位色);
除了24位真彩色,现在还出现了32位真彩色(RGB888+8)。32位真彩色并非是2的32次方的发色数,它其实是1677万多色,不过它增加了8位共256阶颜色的灰度,为了方便称呼,就规定它为32位色。它是24位发色数再加上256阶灰度等级。在我们的计算机中图像是以RGB888格式显示图像的,24位图每个像素保存了32bit的数据,即RGB888+Alpha,Alpha就是半透明填充字节……但是对于真彩的图像而言,肉眼在16bit的时候已经难以分辨了,因此,有些时候,可以讲RGB888转换为RGB565来存储,减少了存储器的容量的同时,降低了数据量;在后端显示的时候,再次把RGB565转换为RGB888,实现数据宽度的匹配!!
**总结:低位增加或者移除**一、RGB888->RGB565
方法只要提取相应单色高位即可(R5 G6 B5),但会导致低位的缺失,影响精度,而且无法恢复。
二.RGB565->RGB888
方法只要补充相应单色低位即可(R3 G2 B3)。RGB888用unsigned int 32位字节存储
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | R7 | R6 | R5 | R4 | R3 | R2 | R1 | R0 | G7 | G6 | G5 | G4 | G3 | G2 | G1 | G0 | B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 |
RGB565用unsigned short 16位字节存储
R7 | R6 | R5 | R4 | R3 | G7 | G6 | G5 | G4 | G3 | G2 | B7 | B6 | B5 | B4 | B3 |
1、#define RGB888_RED 0x00ff0000
2、#define RGB888_GREEN 0x0000ff00
3、#define RGB888_BLUE 0x000000ff
4、#define RGB565_RED 0xf800
5、#define RGB565_GREEN 0x07e0
6、#define RGB565_BLUE 0x001f
7、unsigned short RGB888ToRGB565(unsigned int n888Color)
{
unsigned short n565Color = 0;
// 获取RGB单色,并截取高位
unsigned char cRed = (n888Color & RGB888_RED) >> 19;
unsigned char cGreen = (n888Color & RGB888_GREEN) >> 10;
unsigned char cBlue = (n888Color & RGB888_BLUE) >> 3;
// 连接
n565Color = (cRed << 11) + (cGreen << 5) + (cBlue << 0);
return n565Color;
}
8、unsigned int RGB565ToRGB888(unsigned short n565Color)
{
unsigned int n888Color = 0;
// 获取RGB单色,并填充低位
unsigned char cRed = (n565Color & RGB565_RED) >> 8;
unsigned char cGreen = (n565Color & RGB565_GREEN) >> 3;
unsigned char cBlue = (n565Color & RGB565_BLUE) << 3;
// 连接
n888Color = (cRed << 16) + (cGreen << 8) + (cBlue << 0);
return n888Color;
}