您的位置:首页 > 其它

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

2013-04-09 20:48 281 查看
去年暑假结束的时候有个东西困扰了我好久,是有关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 (字节)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: