24位BMP檔案儲存介紹

致一發表於2014-12-22

24位bmp儲存是按BGR BGR。。。 存的

bmp點陣圖在儲存時,圖片資料部分的位元組數一定是4的倍數,如果不夠四的倍數,在每一行要補齊位元組。

具體說是這樣,假設現在有一張圖,寬6個畫素,高隨便,24位格式儲存(每個畫素點佔三個位元組,分別代表RGB三顏色)
那麼它每行有效資料部分應該是6×3=18位元組,18不是4的倍數,所以要補齊,補到20位元組。最終儲存格式如下圖:
 
前18位為有效畫素資料,最後兩位XX為填補資料,無意義
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
BGR BGR BGR BGR BGR BGR XX
……
 
在影象顯示時,填充的資料是不會顯示出來的。

但是我們在對影象進行處理時,要注意跳過這些無效的填充資料。

調色盤問題

 調色盤用於說明點陣圖中的顏色,它有若干個表項,每個表項是一個RGBQUAD型別的結構,定義一種顏色。RGBQUAD結構的定義

typedef struct tagRGBQUAD

{

  BYTE rgbBlure;

  BYTE rgbGreen;

  BYTE rgbRed;

  BYTE rgbReserved;//保留,必須為0

}

二、

 調色盤中RGBQUAD結構資料的個數有bitBitCount來確定;

當biBitCount=1,4,8時,分別有2,16,256個表項。

當biBitCount=24時,該BMP影象就是24Bit真彩圖,沒有調色盤。

三、

 點陣圖資料內容

 點陣圖資料記錄了點陣圖的每一個畫素值,記錄順序是在掃描行內從左到右,掃描行之間是從下到上。點陣圖的一個畫素值

 所佔的位元組數由biBitCount來確定:

 當biBitCount=1時,8個畫素佔1個位元組;

 當biBitCount=4時,2個畫素佔1個位元組;

 當biBitCount=8時,1個畫素佔1個位元組;

 當biTbiCount=24時,1個畫素佔3個位元組。

 24位真彩圖每一行佔的實際位元組數()

  Windows規定一個掃描行所佔的位元組數必須是4的倍數(即以long為單位)不足的以0填充

 一個掃描行所佔的位元組數的計算方法

DataSizePerLine=(biwidth*biBitCount/8+3)/4*4

圖片資料的大小(不壓縮情況下)

DataSize=DataSizePerLine*biHeight;

//公式解釋

注意:C語言的除法裡,兩個int相除,結果會被CUT掉——只取商而不取餘數。
biwidth*biBitCount/8 好理解,就是一個掃描行的位元組數,
記 b = biwidth*biBitCount/8,  那麼, 原式 =(b+3)/4*4,
情況一,b是四的倍數,(b+3)/4*4 == (b/4*4 + 3/4*4) == b + 0 == b
情況二,b不是四的倍數
  另 b = 4x+n,其中4x就是x的4倍數,n就是那個餘數。
  容易得知:1 <= n <= 3,   4 <= n+3 <= 6,
    於是,原式 ==  (4x+n + 3)/4*4, (其中x是任意值),
                       ==  (4x/4*4 + (n+3)/4*4)
    在C語言中  ==   4x + 4  == (x+1)*4

相關文章