BMP檔案結構

2021-04-15 21:18:22 字數 2280 閱讀 1749

1. bmp檔案組成

bmp檔案由檔案頭、位圖資訊頭、顏色資訊和圖形資料四部分組成。

檔案頭主要包含檔案的大小、檔案型別、影象資料偏離檔案頭的長度等資訊.

位圖資訊頭包含圖象的尺寸資訊、影象用幾個位元數值來表示乙個畫素、影象是否壓縮、影象所用的顏色數等資訊。

顏色資訊包含影象所用到的顏色表,顯示影象時需用到這個顏色表來生成調色盤,但如果影象為真彩色,既影象的每個畫素用24個位元來表示,檔案中就沒有這一塊資訊,也就不需要操作調色盤。

檔案中的資料塊表示影象的相應的畫素值,需要注意的是:影象的畫素值在檔案中的存放順序為從左到右,從下到上,也就是說,在bmp檔案中首先存放的是影象的最後一行畫素,最後才儲存影象的第一行畫素,但對與同一行的畫素,則是按照先左邊後右邊的的順序儲存的;另外乙個需要關注的細節是:檔案儲存影象的每一行畫素值時,如果儲存該行畫素值所佔的位元組數為4的倍數,則正常儲存,否則,需要在後端補0,湊足4的倍數。

2. bmp檔案頭

bmp檔案頭資料結構含有bmp檔案的型別、檔案大小和點陣圖起始位置等資訊。其結構定義如下:

typedef struct tagbitmapfileheader

bitmapfileheader;該結構佔據14個位元組。

3. 位圖資訊頭

bmp點陣圖資訊頭資料用於說明點陣圖的尺寸等資訊。其結構如下:

typedef struct tagbitmapinfoheader bitmapinfoheader;該結構佔據40個位元組。

注意:對於bmp檔案格式,在處理單色影象和真彩色影象的時候,無論圖象資料多麼龐大,都不對圖象資料進行任何壓縮處理,一般情況下,如果位圖採用壓縮格式,那麼16色影象採用rle4壓縮演算法,256色影象採用rle8壓縮演算法。

4. 顏色表

顏色表用於說明點陣圖中的顏色,它有若干個表項,每乙個表項是乙個rgbquad型別的結構,定義一種顏色。rgbquad結構的定義如下:

typedef struct tagrgbquad rgbquad;

顏色表中rgbquad結構資料的個數由bitmapinfoheader 中的bibitcount項來確定,當bibitcount=1,4,8時,分別有2,16,256個顏色表項,當bibitcount=24時,影象為真彩色,影象中每個畫素的顏色用三個位元組表示,分別對應r、g、b值,影象檔案沒有顏色表項。位圖資訊頭和顏色表組成位圖資訊,bitmapinfo結構定義如下:

typedef struct tagbitmapinfo bitmapinfo;

注意:rgbquad資料結構中,增加了乙個保留字段rgbreserved,它不代表任何顏色,必須取固定的值為0,同時, rgbquad結構中定義的顏色值中,紅色、綠色和藍色的排列順序與一般真彩色影象檔案的顏色資料排列順序恰好相反,即:若某個點陣圖中的乙個畫素點的顏色的描述為00,00,ff,00,則表示該點為紅色,而不是藍色。

5. 位圖資料

位圖資料記錄了點陣圖的每乙個畫素值或該對應畫素的顏色表的索引值,影象記錄順序在掃瞄行內是從左到右,掃瞄行之間是從下到上。這種格式我們又稱為bottom_up點陣圖,當然與之相對的還有up_down形式的點陣圖,它的記錄順序是從上到下的,對於這種形式的點陣圖,也不存在壓縮形式。點陣圖的乙個畫素值所佔的位元組數:當bibitcount=1時,8個畫素佔1個位元組;當bibitcount=4時,2個畫素佔1個位元組;當 bibitcount=8時,1個畫素佔1個位元組;當bibitcount=24時,1個畫素佔3個位元組,此時影象為真彩色影象。當影象不是為真彩色時,影象檔案中包含顏色表,點陣圖的資料表示對應畫素點在顏色表中相應的索引值,當為真彩色時,每乙個畫素用三個位元組表示影象相應畫素點彩色值,每個位元組分別對應r、g、b分量的值,這時候影象檔案中沒有顏色表。上面我已經講過了,windows規定影象檔案中乙個掃瞄行所佔的位元組數必須是4的倍數(即以字為單位),不足的以0填充,影象檔案中乙個掃瞄行所佔的位元組數計算方法:

datasizeperline= (biwidth* bibitcount+31)/8;// 乙個掃瞄行所佔的位元組數

位圖資料的大小按下式計算(不壓縮情況下):

datasize= datasizeperline* biheight。

上述是bmp檔案格式的說明,搞清楚了以上的結構,就可以正確的操作影象檔案,對它進行讀或寫操作了。

您說的有乙個錯誤:

我們假設某影象有9行9列,每個象素用1bit來訪問,很顯然,在實際儲存時它的每一行應該是4個byte.而根據您的算式,datasizeperline=(9*1+31)/8=5;它將占用5個byte.

這與每行應該用4個位元組來儲存相違備.

正確的算式是:datasizeperline=(biwidth*bibitcout+31)/32*4

BMP檔案結構

1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...

BMP檔案結構

1.bmp檔案組成 bmp檔案由檔案頭 位圖資訊頭 顏色資訊和圖形資料四部分組成。2.bmp檔案頭 bmp檔案頭資料結構含有bmp檔案的型別 檔案大小和點陣圖起始位置等資訊。其結構定義如下 typedef struct tagbitmapfileheader bitmapfileheader 3.位...

BMP檔案結構

平常我們常見的 bmp檔案即位 件,又稱dib裝置無關位圖,是相對於系統記憶體中使用的ddb裝置相關位圖而言的.一 位 件頭 bitmapfileheader struct bftype word 檔案標識,必須是 bm bfsize dword 位 件大小,以位元組為單位 bfreserved1 ...