1 BMP檔案的組成
BMP檔案由檔案頭、位元影像資訊頭、顏色資訊和圖形資料四部分組成。檔案頭主要包含檔案的大小、檔案類型、映像資料偏離檔案頭的長度等資訊;位元影像資訊頭包含圖象的尺寸資訊、映像用幾個位元數值來表示一個像素、映像是否壓縮、映像所用的顏色數等資訊。顏色資訊包含映像所用到的顏色表,顯示映像時需用到這個顏色表來產生調色盤,但如果映像為真彩色,既映像的每個像素用24個位元來表示,檔案中就沒有這一塊資訊,也就不需要操作調色盤。檔案中的資料區塊表示映像的相應的像素值,需要注意的是:映像的像素值在檔案中的存放順序為從左至右,從下到上,也就是說,在BMP檔案中首先存放的是映像的最後一行像素,最後才儲存映像的第一行像素,但對與同一行的像素,則是按照先左邊後右邊的的順序儲存的;另外一個需要讀者朋友關注的細節是:檔案儲存體映像的每一行像素值時,如果儲存該行像素值所佔的位元組數為4的倍數,則正常儲存,否則,需要在後端補0,湊足4的倍數。
2. BMP檔案頭
BMP檔案頭資料結構含有BMP檔案的類型、檔案大小和位元影像起始位置等資訊。其結構定義如下:
typedef struct tagBITMAPFILEHEADER{WORD bfType; // 位元影像檔案的類型,必須為“BMP”DWORD bfSize; // 位元影像檔案的大小,以位元組為單位WORD bfReserved1; // 位元影像檔案保留字,必須為0WORD bfReserved2; // 位元影像檔案保留字,必須為0DWORD bfOffBits; // 位元影像資料的起始位置,以相對於位元影像檔案頭的位移量表示,以位元組為單位} BITMAPFILEHEADER;該結構佔據14個位元組。
3. 位元影像資訊頭
BMP位元影像資訊頭資料用於說明位元影像的尺寸等資訊。其結構如下:
typedef struct tagBITMAPINFOHEADER{DWORD biSize; // 本結構所佔用位元組數LONG biWidth; // 位元影像的寬度,以像素為單位LONG biHeight; // 位元影像的高度,以像素為單位WORD biPlanes; // 目標裝置的平面數不清,必須為1WORD biBitCount// 每個像素所需的位元,必須是1(雙色), 4(16色),8(256色)或24(真彩色)之一DWORD biCompression; // 位元影像壓縮類型,必須是 0(不壓縮),1(BI_RLE8壓縮類型)或2(BI_RLE4壓縮類型)之一DWORD biSizeImage; // 位元影像的大小,以位元組為單位LONG biXPelsPerMeter; // 位元影像水平解析度,每米像素數LONG biYPelsPerMeter; // 位元影像垂直解析度,每米像素數DWORD biClrUsed;// 位元影像實際使用的顏色表中的顏色數DWORD biClrImportant;// 位元影像顯示過程中重要的顏色數} BITMAPINFOHEADER;該結構佔據40個位元組。
注意:對於BMP檔案格式,在處理單色映像和真彩色映像的時候,無論圖象資料多麼龐大,都不對圖象資料進行任何壓縮處理,一般情況下,如果位元影像採用壓縮格式,那麼16色映像採用RLE4壓縮演算法,256色映像採用RLE8壓縮演算法。
4. 顏色表
顏色表用於說明位元影像中的顏色,它有若干個表項,每一個表項是一個RGBQUAD類型的結構,定義一種顏色。RGBQUAD結構的定義如下:
typedef struct tagRGBQUAD {BYTErgbBlue;// 藍色的亮度(值範圍為0-255)BYTErgbGreen; // 綠色的亮度(值範圍為0-255)BYTErgbRed; // 紅色的亮度(值範圍為0-255)BYTErgbReserved;// 保留,必須為0} RGBQUAD;
顏色表中RGBQUAD結構資料的個數由BITMAPINFOHEADER 中的biBitCount項來確定,當biBitCount=1,4,8時,分別有2,16,256個顏色表項,當biBitCount=24時,映像為真彩色,映像中每個像素的顏色用三個位元組表示,分別對應R、G、B值,影像檔沒有顏色表項。位元影像資訊頭和顏色表組成位元影像資訊,BITMAPINFO結構定義如下:
typedef struct tagBITMAPINFO {BITMAPINFOHEADER bmiHeader; // 位元影像資訊頭RGBQUAD bmiColors[1]; // 顏色表} 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檔案格式的說明,搞清楚了以上的結構,就可以正確的操作影像檔,對它進行讀或寫操作了。