BMP檔案格式分析
BMP(Bitmap-File)圖形檔案是Windows採用的 圖形檔案格式,在Windows環境下啟動並執行所有圖象處理軟體都支援BMP圖象檔案格式。Windows系統內部各映像繪製操作都是以BMP為基礎的。 Windows 3.0以前的BMP圖檔案格式與顯示裝置有關,因此把這種BMP圖象檔案格式稱為裝置相關位元影像DDB(device-dependent bitmap)檔案格式。Windows 3.0以後的BMP圖象檔案與顯示裝置無關,因此把這種BMP圖象檔案格式稱為裝置無關位元影像DIB(device-independent bitmap)格式(註:Windows 3.0以後,在系統中仍然存在DDB位元影像,象BitBlt()這種函數就是基於DDB位元影像的,只不過如果你想將映像以BMP格式儲存到磁碟檔案中時,微軟 極力推薦你以DIB格式儲存),目的是為了讓Windows能夠在任何類型的顯示裝置上顯示所儲存的圖象。BMP位元影像檔案預設的副檔名是BMP或者 bmp(有時它也會以.DIB或.RLE作副檔名)。
6.1.2 檔案結構
位元影像檔案可看成由4個部分組成:位元影像檔案頭(bitmap-file header)、位元影像資訊頭(bitmap-information header)、彩色表(color table)和定義位元影像的位元組陣列,它具有如下所示的形式。
位元影像檔案的組成 |
結構名稱 |
符號 |
| 位元影像檔案頭(bitmap-file header) |
BITMAPFILEHEADER |
bmfh |
| 位元影像資訊頭(bitmap-information header) |
BITMAPINFOHEADER |
bmih |
| 彩色表(color table) |
RGBQUAD |
aColors[] |
| 圖象資料陣列位元組 |
BYTE |
aBitmapBits[] |
位元影像檔案結構可綜合在表6-01中。
表01 位元影像檔案結構內容摘要
| |
位移量 |
域的名稱 |
大小 |
內容 |
圖象檔案 頭 |
0000h |
檔案標識 |
2 bytes |
兩位元組的內容用來識別位元影像的類型: ‘BM’ : Windows 3.1x, 95, NT, … ‘BA’ :OS/2 Bitmap Array ‘CI’ :OS/2 Color Icon ‘CP’ :OS/2 Color Pointer ‘IC’ : OS/2 Icon ‘PT’ :OS/2 Pointer 註:因為OS/2系統並沒有被普及開,所以在編程時,你只需判斷第一個標識“BM”就行。 |
| |
0002h |
File Size |
1 dword |
用位元組表示的整個檔案的大小 |
| |
0006h |
Reserved |
1 dword |
保留,必須設定為0 |
| |
000Ah |
Bitmap Data Offset |
1 dword |
從檔案開始到位元影像資料開始之間的資料(bitmap data)之間的位移量 |
| |
000Eh |
Bitmap Header Size |
1 dword |
位元影像資訊頭(Bitmap Info Header)的長度,用來描述位元影像的顏色、壓縮方法等。下面的長度表示: 28h - Windows 3.1x, 95, NT, … 0Ch - OS/2 1.x F0h - OS/2 2.x 註:在Windows95、98、2000等作業系統中,位元影像資訊頭的長度並不一定是28h,因為微軟已經制定出了新的BMP檔案格式,其中的資訊頭結構變化比較大,長度加長。所以最好不要直接使用常數28h,而是應該從具體的檔案中讀取這個值。這樣才能確保程式的相容性。 |
| |
0012h |
Width |
1 dword |
位元影像的寬度,以象素為單位 |
| |
0016h |
Height |
1 dword |
位元影像的高度,以象素為單位 |
| |
001Ah |
Planes |
1 word |
位元影像的位面數(註:該值將總是1) |
| 圖象 資訊 頭 |
001Ch |
Bits Per Pixel |
1 word |
每個象素的位元 1 - 單色位元影像(實際上可有兩種顏色,預設情況下是黑色和白色。你可以自己定義這兩種顏色) 4 - 16 色位元影像 8 - 256 色位元影像 16 - 16bit 高彩色位元影像 24 - 24bit 真彩色位元影像 32 - 32bit 增強型真彩色位元影像 |
| |
001Eh |
Compression |
1 dword |
壓縮說明: 0 - 不壓縮 (使用BI_RGB表示) 1 - RLE 8-使用8位RLE壓縮方式(用BI_RLE8表示) 2 - RLE 4-使用4位RLE壓縮方式(用BI_RLE4表示) 3 - Bitfields-位域存放方式(用BI_BITFIELDS表示) |
| |
0022h |
Bitmap Data Size |
1 dword |
用位元組數表示的位元影像資料的大小。該數必須是4的倍數 |
| |
0026h |
HResolution |
1 dword |
用象素/米表示的水平解析度 |
| |
002Ah |
VResolution |
1 dword |
用象素/米表示的垂直解析度 |
| |
002Eh |
Colors |
1 dword |
位元影像使用的顏色數。如8-位元/象素表示為100h或者 256. |
| |
0032h |
Important Colors |
1 dword |
指定重要的顏色數。當該域的值等於顏色數時(或者等於0時),表示所有顏色都一樣重要 |
| 調色盤資料 |
根據BMP版本的不同而不同 |
Palette |
N * 4 byte |
調色盤規範。對於調色盤中的每個表項,這4個位元組用下述方法來描述RGB的值:
|
1位元組用於藍色分量 |
|
1位元組用於綠色分量 |
|
1位元組用於紅色分量 |
|
1位元組用於填充符(設定為0) |
|
| 圖象資料 |
根據BMP版本及調色盤尺寸的不同而不同 |
Bitmap Data |
xxx bytes |
該域的大小取決於壓縮方法及映像的尺寸和映像的位元深度,它包含所有的位元影像資料位元組,這些資料可能是彩色調色盤的索引號,也可能是實際的RGB值,這將根據映像資訊頭中的位元深度值來決定。 |