GRB888和RGB565互相转换
RGB565用了2个字节,排列方式如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/38eaf7dd6a0c4c1aadd1375471153406.png)
RGB888 用了4个字节,把上面的RGB565转换后,排列法方式如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/8341a6338d4f4da5b1e2d0f48cee9096.png)
RGB565转换成RGB888时,只需将RGB565的颜色拿过来放进RGB888的高位,RGB888的低位补0,所以16位色转换成24位色时精度不会提高。
反过来,RGB888转换RGB565时,R的高5位,G的高6位,B的高5位拿过来放进RGB565,所以24位色转换成16位色会损失精度。
RGB的 0xFFFF 转换成RGB888后为 0xF8FCF8,如下:
(RGB565)0xFFFF 1111 1111 1111 1111
(RGB888)0xF8FCF8 1111 1000 1111 1100 1111 1000
RGB的 0xF0F0 转换成RGB888后为 0xF01C80,如下:
(RGB565)0xF0F0 1111 0000 1111 0000
(RGB888)0xF01C80 1111 0000 0001 1100 1000 0000
#define RGB888_RED 0x00ff0000
#define RGB888_GREEN 0x0000ff00
#define RGB888_BLUE 0x000000ff
unsigned short RGB888ToRGB565(const 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;
}
#define RGB565_RED 0xf800 //1111 1000 0000 0000 | 0000 0000 1111 1000
#define RGB565_GREEN 0x07e0 //0000 0111 1110 0000 | 0000 0000 1111 1100
#define RGB565_BLUE 0x001f //0000 0000 0001 1111 | 0000 0000 1111 1000
unsigned int RGB565ToRGB888(const unsigned short n565Color)
{
u32 n888Color = 0;
u32 cRed = (n565Color & RGB565_RED) << 8;
u32 cGreen = (n565Color & RGB565_GREEN) << 5;
u32 cBlue = (n565Color & RGB565_BLUE) << 3;
n888Color = cRed | cGreen | cBlue ;
return n888Color;
}
RGB888转RGB666
GRB888:RRRR RRRR GGGG GGGG BBBB BBBB
GRB666:RRRR RRGG GGGG BBBB BB
C1 = (Color & 0X00FCFCFC ) >>2
C2 = (Color & 0X0000FC00 ) >>4
C3 = (Color & 0X00FC0000 ) >>6
C1|C2|C3
32位机:
Color = ( (Color & 0X00FCFCFC ) >>2 )|((Color & 0X0000FC00 ) >>4)|((Color & 0X00FC0000 ) >>6);