bmp格式解析

位圖文件(Bitmap-File,BMP)格式是Windows採用的圖像文件存儲格式,在Windows環境下運行的所有圖像處理軟件都支持這種格式。Windows 3.0以前的BMP位圖文件格式與顯示設備有關,因此把它稱爲設備相關位圖(device-dependent bitmap,DDB)文件格式。Windows 3.0以後的BMP位圖文件格式與顯示設備無關,因此把這種BMP位圖文件格式稱爲設備無關位圖(device-independent bitmap,DIB)格式,目的是爲了讓Windows能夠在任何類型的顯示設備上顯示BMP位圖文件。
      位圖文件可看成由4個部分組成:位圖文件頭(bitmap-file header)、位圖信息頭(bitmap-information header)、彩色表(color table)和定義位圖的字節陣列。可以文本打開方式打開BMP文件。
(1)文件頭信息塊
0000-0001:文件標識,爲字母ASCII碼“BM”,42 4D。亦或者與19778相比較。
0002-0005:整個文件大小,單位字節。  低字節在前。
0006-0009:保留,每字節以“00”填寫。
000A-000D:記錄圖像數據區的起始位置。從文件開始到位圖數據(bitmap data)之間的偏移量。 
(2)圖像描述信息塊
000E-0011:圖像描述信息塊的大小,常爲28H。
0012-0015:圖像寬度。以像素爲單位。低字節在前。
0016-0019:圖像高度。以像素爲單位。低字節在前。
001A-001B:圖像的plane總數(恆爲1)。
001C-001D:記錄像素的位數,很重要的數值,圖像的顏色數由該值決定。
1 - Monochrome bitmap,
4 - 16 color bitmap,
8 - 256 color bitmap,
F - 16位位圖,
10 - 16位RGB565位圖,
18 - 24bit (true color) bitmap,
20 - 32位位圖。
001E-0021:數據壓縮方式(數值位0:不壓縮;1:8位壓縮;2:4位壓縮;3:Bitfields壓縮)。
0022-0025:圖像區數據的大小。單位字節,該數必須是4的倍數。
0026-0029:水平每米有多少像素,在設備無關位圖(.DIB)中,每字節以00H填寫。
002A-002D:垂直每米有多少像素,在設備無關位圖(.DIB)中,每字節以00H填寫。
002E-0031:此圖像所用的顏色數。
0032-0035:指定重要的顏色數。當該域的值等於顏色數時(或者等於0時),表示所有顏色都一樣重要。
     如上,整個位圖的信息頭共54字節,每個位置有特定含義。
(3)顏色表(調色板)
      顏色表的大小根據所使用的顏色模式而定,其中每4字節表示一種顏色,並以B(藍色)、G(綠色)、R(紅色)、alpha(32位位圖的透明度值,一般不需要)。顏色表的大小根據所使用的顏色模式而定:2色圖像爲8字節;16色圖像位64字節;256色圖像爲1024字節。其中,每4字節表示一種顏色,並以B (藍色)、G(綠色)、R(紅色)、alpha(32位位圖的透明度值,一般不需要)。即首先4字節表示顏色號1的顏色,接下來表示顏色號2的顏色,依此類推。   
      對於24-位真彩色圖象就不使用彩色表(同樣也包括16位、和32位位圖),因爲位圖中的RGB值就代表了每個象素的顏色;而對於使用索引顏色的,則需要較大的調色板。
(4)圖像數據區
       顏色表接下來爲位圖文件的圖像數據區,在此部分記錄着每點像素對應的顏色索引號,其記錄方式也隨顏色模式而定,既2色圖像每點佔1位(8位爲1字節);16色圖像每點佔4位(半字節);256色圖像每點佔8位(1字節);真彩色圖像每點佔24位(3字節)。所以,整個數據區的大小也會隨之變化。究其規律而言,可的出如下計算公式:圖像數據信息大小=(圖像寬度*圖像高度*記錄像素的位數)/8。掃描行是由底向上存儲的,這就是說,陣列中的第一個字節表示位圖左下角的像素,而最後一個字節表示位圖右上角的像素。
       然而,未壓縮的圖像信息區的大小。除了真彩色模式外,其餘的均大於或等於數據信息的大小。這是爲什麼呢?原因有兩個:
BMP文件記錄一行圖像是以字節爲單位的。因此,就不存在一個字節中的數據位信息表示的點在不同的兩行中。也就是說,設顯示模式位16色,在每個字節分配兩個點信息時,如果圖像的寬度爲奇數,那麼最後一個像素點的信息將獨佔一個字節,這個字節的後4位將沒有意義。接下來的一個字節將開始記錄下一行的信息。 
(5)實例分析

     如下的4x4像素的位圖

經過UE打開成16進制文件後,顯示如下:

我們可以通過查找對應的數據位來驗證上面所分析的各部分信息。這樣就比較清楚了。
24位真彩色的數據格式爲  B(8位)G(8位)R(8位),這是由於低字節在前造成的。 
(6)位圖操作常使用的結構體 
      位圖頭文件結構:
typedef struct tagBITMAPFILEHEADER{
     short bfType;
     int bfSize;
     short bfReserved1;
     short bfReserved2;
     int bfOffBits;
}BITMAPFILEHEADER, *PBITMAPFILEHEADER;
      位圖信息結構:
typedef struct tagBITMAPINFOHEADER{
      int biSize;
      int biWidth;
      int biHeight;
      short biPlanes;
      short biBitCount;
      int biCompression;
      int biSizeImage;
      int biXPelsPerMeter;
      int biYPelsPerMeter;
      int biClrUsed;
      int biClrImportant;
}BITMAPINFOHEADER,*PBITMAPINFOHEADER;
 (7)掃描順序
BMP位圖掃描順序是從圖片的左下角像素由左至右,由下至上進行掃描的

參考原文:http://blog.csdn.net/jsjjms/archive/2007/04/18/1568615.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章