天天看點

bmp格式解析 && Android 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位位圖,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位位圖的透明度值,一般不需要)。對于24-位真彩色圖象就不使用彩色表(同樣也包括16位、和32位位圖),因為位圖中的RGB值就代表了每個象素的顔色;而對于使用索引顔色的,則需要較大的調色闆。

(4)圖像資料區

       顔色表接下來為位圖檔案的圖像資料區,在此部分記錄着每點像素對應的顔色索引号,其記錄方式也随顔色模式而定,既2色圖像每點占1位(8位為1位元組);16色圖像每點占4位(半位元組);256色圖像每點占8位(1位元組);真彩色圖像每點占24位(3位元組)。是以,整個資料區的大小也會随之變化。究其規律而言,可的出如下計算公式:圖像資料資訊大小=(圖像寬度*圖像高度*記錄像素的位數)/8。掃描行是由底向上存儲的,這就是說,陣列中的第一個位元組表示位圖左下角的像素,而最後一個位元組表示位圖右上角的像素。

       然而,未壓縮的圖像資訊區的大小。除了真彩色模式外,其餘的均大于或等于資料資訊的大小。這是為什麼呢?原因有兩個:

BMP檔案記錄一行圖像是以位元組為機關的。是以,就不存在一個位元組中的資料位資訊表示的點在不同的兩行中。也就是說,設顯示模式位16色,在每個位元組配置設定兩個點資訊時,如果圖像的寬度為奇數,那麼最後一個像素點的資訊将獨占一個位元組,這個位元組的後4位将沒有意義。接下來的一個位元組将開始記錄下一行的資訊。 

(5)執行個體分析

     如下的4x4像素的位圖

bmp格式解析 && Android BMP反色

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

bmp格式解析 && Android BMP反色

我們可以通過查找對應的資料位來驗證上面所分析的各部分資訊。這樣就比較清楚了。

(6)位圖操作常使用的結構體 

      位圖頭檔案結構:

typedef struct tagBITMAPFILEHEADER{

     short bfType;

     int bfSize;

     short bfReserved1;

     short bfReserved2;

     int bfOffBits;

}BITMAPFILEHEADER, *PBITMAPFILEHEADER;

      位圖資訊結構:

繼續閱讀