RGB888转换为RGB565格式

RGB888转换为RGB565格式

RGB888用unsigned int 32位字节存储

00000000R7R6R5R4R3R2R1R0G7G6G5G4G3G2G1G0B7B6B5B4B3B2B1B0
        111111110000000000000000
        R:255  0xFFG:0    0x00B:0   0x00

RGB565用unsigned short 16位字节存储

r7r6r5r4r3g7g6g5g4g3g2b7b6b5b4b3
1111100000000000
R: (0xFF &0x1F)<<11G:(0x00 & 0x3F)<<5B:(0x00 & 0x1F)
F800

主要思路:

  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格式,所以需要有这一转换过程。

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

 

 

 

 

 

 

 

    原文作者:Healer19
    原文地址: https://blog.csdn.net/Healer19/article/details/112029170
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞