一、內存分配單位是32位的,即4字節;
二、位圖中每行象素的數據是連續的,而下一行不能和上一行共一個分配單元(4字節),因此每行象素的數據長度必須是4字節的倍數;
三、代碼說明以下:
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 ); spa
} 內存
-------------------------------------------------------------------------------------------------------------------------- it
個人理解: 數據
1.bmp爲4字節的方式,所以在buf中,不論存取仍是顯示,都是以4字節爲單位的。 內存分配
2.接下來的問題就是怎麼肯定一行到底要怎麼對齊。 while
首先,int 的除法。結果仍是int,會舍掉小數點。因此。咱們加上3字節。再除以4。就能夠防止字節數變少 co
eg:Width=1(位圖的寬度爲1像素) BitCount=24(24位的像素位數。1個像素24位即3字節) return
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