16BPP与24BPP的相互转换

今天写了一个裸机图片切换程序,图片数据是从别人的代码中拷贝出来的。移植到一半的时候老是觉得颜色不对,后来仔细阅读别人的代码发现别人显示是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);
		}
	} 
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值