大家好,欢迎来到IT知识分享网。
今天写了一个裸机图片切换程序,图片数据是从别人的代码中拷贝出来的。移植到一半的时候老是觉得颜色不对,后来仔细阅读别人的代码发现别人显示是16BPP(65K)模式,而我的OK6410开发板设置的是24BPP模式。
经过仔细研究编码的区别最后解决了问题。在这里做个笔迹。
24BPP的结构是:前8位表示“红”,中8位表示“绿”,后8位表示“蓝”。如下所示:
RGB888 R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B0
16BPP的结构是:前5位表示“红”,中6位表示“绿”,后5位表示“蓝”。如下所示:
16bit RGB656 R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0
—————-
24BPP -> 16BPP 的转换
24BPP R7 R6 R5 R4 R3 R2 R1 R0 G7 G6 G5 G4 G3 G2 G1 G0 B7 B6 B5 B4 B3 B2 B1 B01
16BPP R7 R6 R5 R4 R3 G7 G6 G5 G4 G3 G2 B7 B6 B5 B4 B3
即取24BPP的RGB值的高位赋给16BPP。不过这种方法会影响显示精度,但是影响不大。
—————-
16BPP -> 24BPP 的转换
16BPP R4 R3 R2 R1 R0 G5 G4 G3 G2 G1 G0 B4 B3 B2 B1 B0
24BPP R4 R3 R2 R1 R0 0 0 0 G5 G4 G3 G2 G1 G0 0 0 B4 B3 B2 B1 B0 0 0 0
即取16BPP的RGB值赋给24BPP的高位。
void show_priture(const unsigned char *str) { u16 hh, x, y, dd; int cc=0; u8 ll; u32 data; for (x = 0; x < 480; x++) { for (y = 0; y < 272; y++) { ll = *str; str++; hh = *str; str++; hh=hh<<8; dd=hh|ll; data = (( dd & 0xF800 ) << 8)|( (dd & 0x7E0) << 5)|(( dd & 0x1F ) << 3); PutPixel(x , y, data); } } }
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/153764.html