大家好,欢迎来到IT知识分享网。
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 |
主要思路:
- R:将RGB888的(R)高5位(R7 R6 R5 R4 R3)与RGB565(r7 r6 r5 r4 r3)相对应,即R值&0x1F(取高5位),然后左移11位——>(R & 0x1F)<<11;
- G:将RGB888的(G)高6位(G7 G6 G5 G4 G3 G2)与RGB565(g7 g6 g5 g4 g3 g2)相对应,即G值&0x3F(取高6位),然后左移5位——> (G & 0x3F)<<5;
- 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格式,所以需要有这一转换过程。
但这种方式并不完美,会丢失一部分颜色数据影响精度,且不能复原,所以还有另一种方案——量化补偿,此处不深究。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/10554.html