LCD驱动以及BMP图四字节对齐的问题

去年暑假结束的时候有个东西困扰了我好久,是有关LCD驱动参数设置问题,没想到今天搞定了~拿出来分享下
最近闲得无聊看到以前玩2440的问题:
在LCD驱动中有这么个代码:s3c_lcd->fix.smem_len = 480*272*32/8;
很奇怪我看到天嵌给的LCD说明书有关分辨率是这样描述的:High Resolution: 391,680 Dots (480 RGB x 272),
就是391680/(480*272)=3.也就是3字节就可以搞掂!可为什么在驱动中是32/8=4,却分配4字节!!!百思不得其解,
初步怀疑因为ARM是32bit的,有可能涉及4字节对齐问题(当然只是猜测),最后找到答案果然确认了我的想法如下:

1、内存分配单位是32位的,即4字节; 
2、位图中每行象素的数据是连续的,而下一行不能和上一行共一个分配单元(4字节),所以每行象素的数据长度必须是4字节的倍数; 
3、代码说明如下: 

int WidthBytes( int nBits, int nWidth ) 
{//nBits为色彩位数, nWidth为每行象素个数 
int nWidthBytes;//每行象素的数据长度 

nWidthBytes = nWidth; 
if( nBits == 1 ) nWidthBytes = ( nWidth + 7 ) / 8; 
else if( nBits == 4 ) nWidthBytes = ( nWidth + 1 ) / 2; /*竟然没有8位的。256色不是很常见吗?!*/
else if( nBits == 16 ) nWidthBytes = nWidth * 2; 
else if( nBits == 24 ) nWidthBytes = nWidth * 3;//24位真彩色 
else if( nBits == 32 ) nWidthBytes = nWidth * 4;//32位真彩色 

//*******四字节对齐******* 
while( ( nWidthBytes & 3 ) != 0 ) nWidthBytes++; 
//*******四字节对齐******* 
return( nWidthBytes ); 

}

--------------------------------------------------------------------------------------------------------------------------

理解:

1.bmp为4字节的方式,因此在buf中,不论存取还是显示,都是以4字节为单位的。

2.接下来的问题就是怎么确定一行到底要怎么对齐。

首先,int 的除法。结果还是int,会舍掉小数点。所以。我们加上3字节。再除以4。就可以防止字节数变少

eg:Width=1(位图的宽度为1像素) BitCount=24(24位的像素位数。1个像素24位即3字节)

Width*BitCount/8=3得出占用的字节数是3.

(3+3)/4 这是求出“基数”,为1. 如果没有加上3的话,商为0,明显不符合题意。

1*4得出LineBytes=4.

同理,如果是以位为单位,就是加上31. Width*BitCount+31

then: (Width*BitCount+31)/32 *4

在这得感谢这位叫渡水河畔的大神~上面这些看完,总算明白以前我看到某本材料上关于LCD的一些技巧,在这分享一下~~~
FrameBuffer的大小=LCD 屏的宽度 * LCD屏的高度 * 每像素的位数 / 每字节的位数;
一个320 * 240 的16位色LCD的FrameBuf fer 的大小则为:
320 * 240 * 16 /  8 = 153600 (字节)

在C语言处理BMP图片并将其转换为LCD屏幕能够正确显示的RGB格式,需要对图像数据进行重排。由于BMP格式通常是按BGR顺序存储的,而许多LCD屏幕则期望数据是RGB格式的,这就需要在显示之前进行颜色通道的转换。 下面是一个简化的示例代码,展示了如何在C语言实现这一转换。请注意,这个示例假设我们处理的是24BMP图片和RGB格式的LCD屏幕。 ```c #include <stdio.h> #include <stdlib.h> void convertBGRtoRGB(unsigned char *bgr, unsigned char *rgb, int width, int height) { for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { int index = (y * width + x) * 3; // 将BGR转换为RGB rgb[index] = bgr[index + 2]; // R rgb[index + 1] = bgr[index + 1]; // G rgb[index + 2] = bgr[index]; // B } } } int main() { // 假设bgr_image是一个包含BGR数据的数组 // 假设rgb_image是一个用来存储转换后的RGB数据的数组 // 假设width和height是图片的宽度和高度 unsigned char *bgr_image, *rgb_image; int width, height; // 这里应该有代码来加载BMP图片到bgr_image // ... // 执行转换 convertBGRtoRGB(bgr_image, rgb_image, width, height); // 这里应该有代码将转换后的RGB数据发送到LCD屏幕 // ... // 释放资源 free(bgr_image); free(rgb_image); return 0; } ``` 注意,这段代码没有包含加载和保存BMP文件的代码,也没有处理LCD屏幕的接口代码,因为这些功能与具体的硬件和文件格式细节密切相关。在实际应用,你需要使用适合的库来读取BMP文件,并且根据你的LCD屏幕的接口来发送图像数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值