BMP格式詳解

2021-09-14 00:55:17 字數 4107 閱讀 8758

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

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

1、整體資訊

bmp格式的檔案從頭到尾依次是如下資訊:

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

影象的部分資訊如下:

2、bmp檔案頭(bmp file header)

bmp檔案頭包含如下資訊:

下圖的資料就是bmp檔案頭:

一共14位元組,下面逐個解釋。

0-1:bftype,表示檔案型別,bmp格式的檔案這兩個位元組是0x4d42,10進製就是19778,字元顯示就是『bm』;

2-5:bfsize,表示檔案的大小,這裡的是0x0004b436,十進位制是308278,也就是301kb,檢查檔案資訊,驗證正確;

6-7:bfreserved1,保留位,必須設定為0;

8-9:bfreserved2,保留位,必須設定為0;

a-d:bfoffbits,4位元組的偏移,表示從檔案頭到位圖資料的偏移,這裡是0x00000436,十進位制是1078,後面會做驗證;

3、位圖資訊頭(bitmap information)

位圖資訊頭一共40位元組,包含如下內容:

下圖資料是點陣圖資訊頭:

一共40位元組,解釋如下:

0e-11:4位元組的bisize,這裡是0x28,即十進位制的40,驗證正確;

12-15:4位元組的biwidth,這裡是0x00000280,即十進位制的640,用畫素表示影象的寬度,檢視檔案資訊驗證正確;

16-19:4位元組的biheight,這裡是0x000001e0,即十進位制的480,用畫素表示影象的高度,檢視檔案資訊驗證正確;同時,這是乙個正數,表示影象是倒立的,即影象資料是從左下角到右上角排列的;

1a-1b:2位元組的biplanes,值為0x0001;

1c-1d:2位元組的bibitcount,值是0x0008,即8,表示每個畫素用8位表示,一共有256個顏色;

1e-21:4位元組的bicompression,值是0,即bi_rgb格式,不壓縮;

22-25:4位元組的bisizeimage,影象的大小,值是0x0004b000,十進位制為307200,由上面的bfsize(檔案大小)和bfoffbits(檔案頭到資料的偏移)分別是308278和1078可以得到,bisizeimage=bfsize-bfoffbits,即影象大小=檔案大小-偏移量;

26-29:4位元組的bixpelspermeter,水平解析度,值是0x00000ec4,十進位制3780;

2a-2d:4位元組的biypelspermeter,垂直解析度,值是0x00000ec4,十進位制3780;

2e-31:4位元組的biclrused,使用的顏色索引數,值是0x00000100,十進位制256,與1c-1d得到的結論一致;

32-35:4位元組的biclrimportant,重要的顏色索引數,值是0x00000100,十進位制256;

4、調色盤(color palette)

調色盤是可選的,不過這裡的8位色圖有調色盤。那麼接下來的資料就是調色盤了。調色盤就是乙個顏色的索引,這裡是8位色圖,一共有256中顏色,由於每個顏色都有rgb三原色,也就是要3個位元組表示,這樣的話256個顏色就不能表示所有的顏色,所以就需要乙個索引,用乙個位元組的索引指向4個位元組表示的顏色(rgb加上alpha值)。如果把這4個位元組表示為乙個color型別,那麼調色盤就是color的陣列。由於color型別也是乙個陣列,調色盤就像乙個二維陣列palette[n][4],其中n是顏色的數量,這裡就是256。因此,這個例子中的調色盤的大小就是256x4=1024位元組,在調色盤之前,有14位元組的bmp檔案頭,40位元組的點陣圖資訊頭,加上1024位元組的調色盤,一共1078位元組,也就是說真正的影象資料前面有1078位元組,這和bmp檔案頭中的bfoffbits相符,驗證了我們的討論。

有的影象沒有調色盤,比如下面的24位色圖:

頭部資料如下:

根據上面的討論可以知道,bibitcount是24(0x18),bfoffbits是54(0x36),即沒有調色盤,位圖資訊頭接下來就是影象資料了。

調色盤中的資料每4位元組一組,分別表示藍、綠、紅和alpha值。按照第乙個影象舉例來說:索引藍

綠紅alpha001

1037001

0010

4900200

1844003

011d

5800

5、位圖資料

接下來就是位圖資料了。由於是8位色圖,所以每個畫素用1個位元組表示,取出每個位元組,顯示到相應的裝置上就可以了。

注意,這裡的biheight為正數,說明影象倒立,從左下角開始到右上角,以行為主序排列。

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

位圖資料排列還有乙個規則,就是對齊。

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

填充後的每行資料如下:

原文的公式寫錯了,公式應為:rowsize = 4*((bpp*width+31)/32)

其中,bpp是每畫素的位元數(bits per pixel),即bibitcount,width是寬度,單位是畫素即bfwidth。

對於我們這個例子,bpp是8,width是480,正好是4的倍數,也就是沒有填充。來計算一下:

rowsize=4*((8*480+31)/32)=480位元組,驗證沒有填充。

按照沒填充計算:454*83*3=113046 bytes,與真實值相差166位元組。

按照填充公式,每行有資料4*((24*454+31)/32)=1364 位元組,真正的資料有454*3=1362位元組,也就是說每行填充了2位元組0,一共83行,共填充83*2=166位元組,驗證了我們的討論。

在程式中,我們可以用下面的**計算每行的資料:

int bytesperline=((bfwidth*bibitcount+31)>>5)<<2;

那麼,位圖資料大小為:

int imagesize=bytesperline*bfheight;

這樣的話,每掃瞄完一行資料,最後的幾個位元組可能是填充的0,需要跳過:

int skip=4-((bfwidth*bibitcount)>>3)&3;

BMP格式詳解

列舉 c windows blue lace 16.bmp 位 件頭的格式 typedef structbitmapfileheader 檔案頭結構體,14位元組 typedef structbitmapinfoheader 位圖資訊頭,40位元組 bmp檔案詳解 2 2007 03 21 12 2...

BMP格式詳解

bmp檔案的資料按照從檔案頭開始的先後順序分為四個部分 1 bmp檔案頭 bmp file header 提供檔案的格式 大小等資訊 2 位圖資訊頭 bitmap information 提供影象資料的尺寸 位平面數 壓縮方式 顏色索引等資訊 3 調色盤 color palette 可選,如使用索引...

關於BMP檔案格式的詳解

什麼是bmp bmp 全稱bitmap 是windows作業系統中的標準影象檔案格式,可以分成兩類 裝置相關位圖 ddb 和裝置無關位圖 dib 使用非常廣。它採用位對映儲存格式,除了影象深度可選以外,不採用其他任何壓縮,因此,bmp檔案所占用的空間很大。bmp檔案的影象深度可選lbit 4bit ...