關於BMP檔案格式的詳解

2021-07-25 13:52:19 字數 3185 閱讀 5529

什麼是bmp

bmp(全稱bitmap)是windows作業系統中的標準影象檔案格式,可以分成兩類:裝置相關位圖(ddb)和裝置無關位圖(dib),使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,不採用其他任何壓縮,因此,bmp檔案所占用的空間很大。bmp檔案的影象深度可選lbit、4bit、8bit及24bit。bmp檔案儲存資料時,影象的掃瞄方式是按從左到右、從下到上的順序。由於bmp檔案格式是windows環境中交換與圖有關的資料的一種標準,因此在windows環境中執行的圖形影象軟體都支援bmp影象格式。

這裡通過乙個具體的例子對bmp格式做乙個簡單的介紹。

1.整體資訊:位**件可看成由4個部分組成:

(1).位**件頭(bitmap-file header)、一共14位元組

(2).點陣圖資訊頭(bitmap-information header)、一共40位元組

(3).彩色表(color table)、即調色盤,大小可選

(4).定義點陣圖的位元組陣列,即位圖資料

最常見的就是24點陣圖,所謂的24點陣圖,就是說乙個畫素的顏色資訊用24位來表示,也就是說,對於三原色brg,每乙個顏色都用以位元組(8)位來表示。除了24點陣圖,還有1位(單色),2位(4色,cga),4位(16色,vga),8位(256色),16位(增強色),24位(真彩色)和32位等。

對照進行分析

(1).以上為我們這次需要分析的,我們使用winhex開啟這個檔案,然後對原始碼進行分析

位**件頭(14位元組)

00h-01h (2bytes) :表示檔案型別  bmp格式的檔案這兩個位元組是0x4d42,10進製就是19778,字元顯示就是『bm』;

02h-05h (4bytes) :用位元組表示整個檔案的大小,0x00030038對應的十進位制為:196664bytes,這時候我們檢視檔案屬性驗證一下:

我們可以看到,檔案的大小確實為196664位元組。

06h-09h (4bytes) :保留位,必須設定為0;

0ah-odh (4bytes) :從檔案開始到位圖資料開始之間的資料量,稱為偏移量:偏移量大小=位**件頭大小+點陣圖資訊頭大小+調色盤大小。

位圖資訊頭(40位元組)

0eh-11h (4bytes) :位圖資訊頭的長度,驗證一下:0x0028對應的十進位制為40,驗證正確

12h-15h (4bytes) :點陣圖的寬度(單位為畫素),0x00000100對應的十進位制為256,畫素為256px

16h-19h (4bytes) :點陣圖的高度(單位為畫素),0x00000100對應的十進位制位256,畫素為256px。由此可見該位圖的寬和高都為256個畫素,我們開啟檔案屬性驗證一下:

驗證結果正確。

1ah-1bh (2bytes) :點陣圖的位面數。(注:該值恒為1)。

1ch-1dh (2bytes) :每個畫素的位數,從上圖可以看出為24色位圖。根據計算 0x0018對應十進位制的值確實為24。

1eh-21h (4bytes) :

壓縮說明: 

0 - 不壓縮 (使用bi_rgb表示) 

1 - rle 8-使用8位rle壓縮方式(用bi_rle8表示) 

2 - rle 4-使用4位rle壓縮方式(用bi_rle4表示) 

3 - bitfields-位域存放方式(用bi_bitfields表示)

該對應的為0x00000000,則該點陣圖不壓縮。

22h-25h (4bytes) :用位元組數表示的點陣圖資料的大小。該數必須是4的倍數。當不壓縮時,它的取值可以為0。該位圖資料大小為0x00030002,對應的十進位制為:196610,加上頭部的54個位元組,剛好是整個檔案的大小196664個位元組。

26h-29h (4bytes) :用象素/公尺表示的水平解析度。

2ah-2dh (4bytes) :

用象素/公尺表示的垂直解析度。

2eh-31h (4bytes) :檔案使用的顏色數。如果為0,則表示使用了全部可能的顏色。如8-位元/象素表示為0x100或者 256。

32h-35h (4bytes) :指定重要的顏色數。當該域的值等於顏色數時(或者等於0時),表示所有顏色都一樣重要。

調色盤

大小為n*4(bytes),其中n表示顏色的數目。24點陣圖(真彩)是沒有調色盤的,我們來驗證一下當調色盤大小為0是否的偏移量是否為54bytes,0x00000036對應十進位制為54,驗證正確。如果每個畫素的位數不是24而是8,則對應的顏色數n=2^8=256,則調色盤的大小為256*4=1024bytes。

調色盤中的資料每4位元組一組,分別表示藍、綠、紅和alpha值。按照每個畫素的位數字8的影象舉個例子來說:

1位元組用於藍色分量,1位元組用於綠色分量,1位元組用於紅色分量,1位元組用於填充符(設定為0)。

位圖資料

該域的大小取決於壓縮方法及影象的尺寸和影象的位深度,它包含所有的點陣圖資料位元組,這些資料可能是彩色調色盤的索引號, 也可能是實際的rgb值,這將根據影象資訊頭中的位深度值來決定。

如果是8位色圖,則每個畫素用1個位元組表示,取出每個位元組,顯示到相應的裝置上就可以了。

如果是24位色圖,則按照bgr的順序排列,32位色圖按照bgralpha排列。

注意:

位圖資料排列還有乙個規則,就是對齊。windows預設的掃瞄的最小單位是4位元組,如果資料對齊滿足這個值的話對於資料的獲取速度等都是有很大的增益的。因此,bmp影象順應了這個要求,要求每行的資料的長度必須是4的倍數,如果不夠需要進行位元填充(以0填充),這樣可以達到按行的快速訪問。這樣的話,位圖資料的大小就不一定是寬x高x每畫素位元組數了,因為每行還可能有0填充。

填充後的每行資料如下:

bpp :每畫素的位元數(bits per pixel)

對於上圖 bpp=24,width=256。為32的倍數,所以沒有填充。但是54個位元組的檔案頭應該填充為56。

BMP檔案格式

bmp檔案格式 bmp檔案大體上分成四個部分,如圖1所示。位 件頭bitmapfileheader 位圖資訊頭bitmapinfoheader 調色盤 palette 圖象資料 圖1.windows位 件結構示意圖 第一部分為位 件頭bitmapfileheader,是乙個結構,其定義如下 type...

BMP檔案格式

典型的位 件格式通常包含下面幾個資料塊 下面的部分將會詳細地描述位 件中儲存的資料。需要注意的是這是標準點陣圖的檔案格式,其他一些位圖影象可能根據生成檔案的應用程式不同所使用格式可能會有細微的區別。這部分是識別資訊,典型的應用程式會首先普通讀取這部分資料以確保的確是位 件並且沒有損壞。這部分告訴應用...

BMP檔案格式

位置 大小 說明 0000h 2 bm 檔案標識 0002h 4 檔案大小 0006h 4 保留 0 000ah 4 從檔案開始到位圖資料之間的偏移量 000eh 4 位圖資訊頭,用來描述點陣圖的顏色 壓縮方法等。0012h 4 點陣圖的寬度,以象素為單位 0016h 4 點陣圖的高度,以象素為單位...