BMP圖像四字節對齊的問題

 一、內存分配單位是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

相關文章
相關標籤/搜索