RGB888转换为RGB565格式

RGB888转换为RGB565格式

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
                1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
                R:255  0xFF G:0    0x00 B:0   0x00

RGB565用unsigned short 16位字节存储

r7 r6 r5 r4 r3 g7 g6 g5 g4 g3 g2 b7 b6 b5 b4 b3
1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0
R: (0xFF &0x1F)<<11 G:(0x00 & 0x3F)<<5 B:(0x00 & 0x1F)
F 8 0 0

主要思路:

  1. R:将RGB888的(R)高5位(R7 R6 R5 R4 R3)与RGB565(r7 r6 r5 r4 r3)相对应,即R值&0x1F(取高5位),然后左移11位——>(R & 0x1F)<<11;
  2. G:将RGB888的(G)高6位(G7 G6 G5 G4 G3 G2)与RGB565(g7 g6 g5 g4 g3 g2)相对应,即G值&0x3F(取高6位),然后左移5位——> (G & 0x3F)<<5;
  3. B:将RGB888的(B)高5位(B7 B6 B5 B4 B3)与RGB565(b7 b6 b5 b4 b3)相对应,即B值&0x1F(取高5位)——> (B & 0x1F);

举例:红色  RGB888格式为(R:255,G:0,B:0  0xFF0000)     ——>  RGB565格式为(0xF800)

代码实现:

//运用宏封装起来:
#define RGB888_To_RGB565(R,G,B)  (uint16_t)((R & 0x1f)<<11|(G & 0x3f)<<5|(B & 0x1f))

//调用时:
RGB888_To_RGB565(255,0,0)  //显示红色
RGB888_To_RGB565(0,255,0)  //显示绿色
RGB888_To_RGB565(0,0,255)  //显示蓝色

说明:在stm32控制LCD液晶显示器时,液晶一般用RGB565格式(为了压缩数据节省空间),但我们查到的颜色数值一般都是RGB888格式,所以需要有这一转换过程。

但这种方式并不完美,会丢失一部分颜色数据影响精度,且不能复原,所以还有另一种方案——量化补偿,此处不深究。

猜你喜欢

转载自blog.csdn.net/Healer19/article/details/112029170