BITMAPFILEHEADER、BITMAPINFOHEADER及BMP結構詳解
BMP檔案總體上由4部分組成,分別是點陣圖檔案頭、點陣圖資訊頭、調色盤和影象資料,如表5-1所示。 表5-1 BMP檔案的組成結構
下面來詳細看一下每個組成部分的細節。 1.點陣圖檔案頭(bitmap-file header) 點陣圖檔案頭(bitmap-file header)包含了影象型別、影象大小、影象資料存放地址和兩個保留未使用的欄位。 開啟WINGDI.h檔案,搜尋"BITMAPFILEHEADER"就可以定位到BMP檔案的點陣圖檔案頭的資料結構定義。
表5-2列出了tagBITMAPFILEHEADER中各欄位的含義。 表5-2 tagBITMAPFILEHEADER結構
2.點陣圖資訊頭(bitmap-information header) 點陣圖資訊頭(bitmap-information header)包含了點陣圖資訊頭的大小、影象的寬高、影象的色深、壓縮說明影象資料的大小和其他一些引數。 開啟WINGDI.h檔案,搜尋"tagBITMAPINFOHEADER"就可以定位到BMP檔案的點陣圖資訊頭的資料結構定義。
表5-3列出了tagBITMAPFILEHEADER中各欄位的含義。 表5-3 tagBITMAPFILEHEADER結構
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
3.彩色表/調色盤(color table) 彩色表/調色盤(color table)是單色、16色和256色影象檔案所特有的,相對應的調色盤大小是2、16和256,調色盤以4位元組為單位,每4個位元組存放一個顏色值,影象 的資料是指向調色盤的索引。 可以將調色盤想象成一個數組,每個陣列元素的大小為4位元組,假設有一256色的BMP影象的調色盤資料為:
影象資料01 00 02 FF表示呼叫調色盤[1]、調色盤[0]、調色盤[2]和調色盤[255]中的資料來顯示影象顏色。 在早期的計算機中,顯示卡相對比較落後,不一定能保證顯示所有顏色,所以在調色盤中的顏色資料應儘可能將影象中主要的顏色按順序排列在前面,點陣圖資訊 頭的biClrImportant欄位指出了有多少種顏色是重要的。 每個調色盤的大小為4位元組,按藍、綠、紅儲存一個顏色值。 開啟WINGDI.h檔案,搜尋"tagRGBTRIPLE"就可以定位到BMP檔案的調色盤的資料結構定義。
表5-4列出了tagRGBTRIPLE中各欄位的含義。 表5-4 tagRGBTRIPLE結構
4.點陣圖資料(bitmap-data) 如果影象是單色、16色和256色,則緊跟著調色盤的是點陣圖資料,點陣圖資料是指向調色盤的索引序號。 如果點陣圖是16位、24位和32位色,則影象檔案中不保留調色盤,即不存在調色盤,影象的顏色直接在點陣圖資料中給出。 16點陣圖像使用2位元組儲存顏色值,常見有兩種格式:5位紅5位綠5位藍和5位紅6位綠5位藍,即555格式和565格式。555格式只使用了15 位,最後一位保留,設為0。 24點陣圖像使用3位元組儲存顏色值,每一個位元組代表一種顏色,按紅、綠、藍排列。 32點陣圖像使用4位元組儲存顏色值,每一個位元組代表一種顏色,除了原來的紅、綠、藍,還有Alpha通道,即透明色。 如果影象帶有調色盤,則點陣圖資料可以根據需要選擇壓縮與不壓縮,如果選擇壓縮,則根據BMP影象是16色或256色,採用RLE4或RLE8壓縮算 法壓縮。 RLE4是壓縮16色影象資料的,RLE4採用表5-5所示方式壓縮資料。 表5-5 RLE4壓縮方法
假設有如下16色點陣圖資料,共20位元組,資料使用了RLE4壓縮:
資料解壓時首先讀取05,因為05不等於0,所以選擇A方案,根據A方案,05表示後面資料重複的次數,接著讀取00,00表示有兩個顏色索引,每 個索引佔4位,第一個畫素在高4位,第二個畫素在低4位,即在一個位元組中低畫素在高位,高畫素在低位。05 00解壓後等於00 00 0。 讀取04,選擇A方案,按照上面的操作解析,04是後面資料重複的次數,05是兩個顏色索引,第3個顏色索引為5,第4個顏色索引為0。04 05解壓後等於05 05。 讀取00,選擇B方案,讀取08,08表示後面有效的顏色索引數。00 08解壓後等於09 05 04 00。 讀取04,選擇A方案,按照上面的操作解析,04是後面資料重複的次數,05是兩個顏色索引。04 05解壓後等於05 05。 讀取08,選擇A方案,按照上面的操作解析,08是後面資料重複的次數,09是兩個顏色索引。08 09解壓後等於09 09 09 09。 讀取07,選擇A方案,按照上面的操作解析,07是後面資料重複的次數,01是兩個顏色索引。07 01解壓後等於01 01 01 0。 讀取00,選擇B方案,讀取00,00表示後面有效的顏色索引數,0表示無,即解壓完一行資料。 綜合上面的操作,解壓後的資料為:
看上去和原來的資料大小一樣,沒有體現到壓縮效果,這是因為上面的例子只選擇了20位元組資料,而且這20位元組資料中重複的資料不多,使用RLE壓縮 重複資料不多的資料時,有時可能壓縮後的大小反而比原來的資料還大。其實一般情況下當資料比較多而且重複的時候,使用RLE壓縮效果還是比較理想的。 RLE8的壓縮方式可以參考上面的RLE4解壓方法,惟一的區別是RLE8使用1個位元組存放顏色索引,而RLE4使用4位存放顏色索引。 結合上面對BMP檔案的分析,下面分別對256色和24位色的BMP影象進行十六進位制分析,通過在十六進位制編輯器中分析檔案結構,能夠增加分析檔案 的經驗。 如圖5-1和圖5-2所示,分別為256色BMP影象cat2.bmp和24位色BMP影象cat1.bmp。其中cat2.bmp影象的解析度為 200×153,檔案大小為31 680位元組。cat1.bmp影象的解析度為200×150,檔案大小為90 056位元組。
現 在來分析cat2.bmp的影象檔案,在Winhex中開啟cat2.bmp,如圖5-3所示。
首先分析點陣圖檔案頭的結構,如圖5-4所示。根據 BMP檔案的點陣圖檔案頭結構定義分析出cat2.bmp影象的點陣圖檔案頭中各欄位的含義,如表5-6所示。
表5-6 cat2.bmp影象檔案中點陣圖檔案頭各欄位的含義
|
繼續分析接下來的資料,根據BMP檔案結構的定義,接下來的資料是點陣圖資訊頭,cat2.bmp影象檔案的點陣圖資訊頭的內容如圖5-5所示。
(點選檢視大圖)圖5-5 cat2.bmp影象的點陣圖資訊頭 |
表5-7所示為cat2.bmp影象檔案中點陣圖資訊頭各欄位的含義。
表5-7 cat2.bmp影象檔案中點陣圖資訊頭各欄位的含義
十六進位制值 | 描 述 |
28 00 00 00: | cat2.bmp影象的點陣圖資訊頭大小 |
C8 00 00 00 | 00 00 00 C8 = 200,是cat2影象的寬度,單位畫素 |
99 00 00 00 | 00 00 00 99 = 153,是cat2影象的高度,單位畫素 |
01 00 | 總是1 |
08 00 | 00 08 = 8,cat2影象的色深,即2的8次冪等於256色 |
00 00 00 00 | 壓縮方式,0表示不壓縮 |
8A 77 00 00 | 00 00 77 8A = 30602,是cat2影象的影象資料大小,單位位元組 |
12 0B 00 00 | 00 00 0B 12 = 2834,cat2影象的水平解析度,單位畫素/m |
12 0B 00 00 | 00 00 0B 12 = 2834,cat2影象的垂直 解析度,單位畫素/m |
00 00 00 00 | cat2影象使用的顏色數,0表示使用全部顏色 |
00 00 00 00 | cat2影象中重要的顏色數,0表示所有顏色都重要 |
繼續分析接下來的資料,根據BMP檔案結構的定義,因為cat2.bmp影象是256色的點陣圖,所以應該有256個調色盤,每個調色盤佔4位元組,整 個調色盤一共1024位元組大小。 cat2.bmp影象檔案的調色盤資料如圖5-6和圖5-7所示。
(點選檢視大圖)圖5-6 cat2.bmp影象的調色盤地址從00000036h開始儲存 |
(點選檢視大圖)圖5-7 cat2.bmp影象的調色盤資料結束地址是00000435h |
從圖5-6和圖5-7中可以看出,cat2.bmp影象的調色盤地址從00000036h開始到00000435h結束,即00000435h - 00000036h + 1 =400h = 1024。
如果想檢視cat2影象的調色盤對應的實際顯示顏色,可以使用Adobe Photoshop CS開啟cat2.bmp,在Adobe Photoshop CS的選單欄中選擇"影象"→"模式"→"顏色表",即可觀看cat2的調色盤,如圖5-8所示。
圖5-8 在Adobe Photoshop CS中檢視cat2的調色盤 |
圖5-8所示cat2.bmp的調色盤顏色和圖5-6中的十六進位制資料是一一對應的。在Adobe Photoshop CS的調色盤上單擊任何一個畫素的顏色即可彈出一個拾色器對話方塊顯示該畫素顏色的詳細組成資訊。cat2.bmp調色盤和cat2.bmp的十六進位制資料 的對應關係如圖5-9所示。
繼續分析接下來的資料,根據BMP檔案結構的定義,如果一個影象有調色盤,那麼緊跟在調色盤後面的是影象的資料,這些資料不是實際的顏色值,而是指 向調色盤陣列的索引,根據索引來獲取調色盤中的顏色,如圖5-10所示。
(點選檢視大圖)圖5-9 cat2.bmp調色盤和cat2.bmp的十六進位制資料的對應關係 |
(點選檢視大圖)圖5-10 cat2.bmp的影象資料 |
因為cat2.bmp是256色的點陣圖,即採用了8位色深作為指向調色盤陣列的索引,所以根據圖5-10中顯示的資料可以得知:49 49 49 B1 49 49 49 49 49 99表示cat2.bmp點陣圖左下角第1個畫素的顏色等於調色盤[49],第2個畫素的顏色等於調色盤[49] ,第3個畫素的顏色等於調色盤[49] ,第4個畫素的顏色等於調色盤[B1]……依此類推。分析完cat2.bmp影象之後,接下來分析的是cat1.bmp。
cat1.bmp影象是24位色影象,根據BMP檔案結構定義得知,cat1.bmp影象沒有調色盤,影象資料儲存的是實際的顏色資料,每個畫素用 3位元組表示,分別是紅綠藍。由於cat1.bmp和cat2.bmp的點陣圖檔案頭和點陣圖資訊頭結構一樣,所以cat1.bmp的點陣圖檔案頭和點陣圖資訊頭可 以參考上面對cat2.bmp的分析,下面從cat1.bmp的點陣圖資訊頭結束的位置開始分析,如圖5-11所示。
(點選檢視大圖)圖5-11 cat1.bmp影象的影象資料 |
從圖5-11可以看到表示每個畫素的紅綠藍三色的值,實際存放的時候是倒過來存放的,在分析BMP影象格式時需要注意這點。
通過上面對BMP檔案儲存結構的分析發現,BMP檔案的點陣圖檔案頭和點陣圖資訊頭存在著大量的重複資料。如果儲存大量同一色深的BMP點陣圖,必然會浪 費大量儲存空間,所以很多時候遊戲程式設計人員都會去掉BMP檔案頭和資訊頭,只保留幾個必要的資訊和影象資料,那麼BMP檔案頭和資訊頭中哪幾個欄位是必須 保留的呢?
使用Winhex的檔案比較功能比較兩個24位色深的BMP影象檔案,觀察兩個檔案的檔案頭和資訊頭有什麼不同的地方,如圖5-12所示。
(點選檢視大圖)圖5-12 使用Winhex比較兩個24位色深的BMP影象檔案 |
從圖5-12可以看出,兩個色深相同的BMP影象的檔案頭和資訊頭一共有4處不同的地方,分別是檔案頭的檔案大小、資訊頭的影象寬度、影象高度和圖 像資料大小。
所以很多時候,遊戲程式設計人員只保留影象檔案的檔案大小、影象寬度、影象高度和影象資料大小資訊,甚至有時不需要保留檔案大小這個數值,使用影象資料大小數值即可。
在分析未知檔案儲存格式時,如果遇到去掉了檔案頭的檔案時,如上面所說的BMP檔案,會給分析未知檔案格式帶來一定的困難。這時需要使用十六進位制編 輯器的檔案比較功能,觀察兩個同類的未知檔案格式尋找某些潛在的規律,如果實在觀察不出規律的,那隻能使用白盒分析方法,對呼叫此未知檔案格式的程式進行反彙編跟蹤除錯了。當然,有時靈感和運氣也很重要。