BMP

視窗位圖圖像文件格式系列

BMP取自點陣圖Bitmap的縮寫,也稱為DIB(與裝置無關的點陣圖),是一種獨立於監視器點陣圖數碼圖像檔案格式。常見於微軟視窗OS/2作業系統,Windows GDI API內部使用的DIB數據結構與 BMP 檔案格式幾乎相同。

Windows點陣圖
副檔名
.bmp, .dib
網路媒體型式image/bmp[1]
image/x-bmp
類型代碼英語Type code'BMP '
'BMPf'
'BMPp'
統一類型標識com.microsoft.bmp
開發者微軟
格式類型點陣圖
自由格式WMFOSP

圖像通常儲存的顏色深度有2(1位)、16(4位元)、256(8位元)、65536(16位元)和約1677萬(24位元)種顏色(其中位是表示每點所用的數據位)。8位元圖像可以是索引彩色圖像外,也可以是灰階圖像。表示透明英語transparency (graphic)alpha通道也可以儲存在一個類似於灰階圖像的獨立檔案中。帶有整合的alpha通道的32位元版本已經隨着Windows XP出現,它在Windows系統的登入介面和系統主題中都有使用。

儲存演算法

BMP檔案通常是不壓縮的,所以它們通常比同一幅圖像的壓縮圖檔格式要大很多。例如,一個800×600的24位元幾乎佔據1.4MB空間。因此它們通常不適合在互聯網或者其他低速或者有容量限制的媒介上進行傳輸。

根據顏色深度的不同,圖像上的一個像素可以用一個或者多個位元組表示,它由n/8所確定(n是位深度,1位元組包含8個數據位)。圖片瀏覽器等基於位元組的ASCII值計算像素的顏色,然後從調色盤中讀出相應的值。更為詳細的資訊請參閱下面關於點陣圖檔案的部份。

n位2n種顏色的包含調色盤的點陣圖近似位元組數可以用下面的公式計算:

BMP檔案大小 ,其中高度(height)和寬度(width)都以像素為單位。

需要注意的是上面公式中的54是點陣圖檔案的檔案頭英語Header (information technology) 是彩色調色盤的大小。 如果點陣圖檔案不包含調色盤,如24位元,32位元點陣圖,則點陣圖的近似位元組數可以用下面的公式計算:

BMP檔案大小 ,其中高度(height)和寬度(width)都以像素為單位。

另外需要注意的是這是一個近似值,對於n位的點陣圖圖像來說,儘管可能有最多 種顏色,一個特定的圖像可能並不會使用這些所有的顏色。由於彩色調色盤僅僅定義了圖像所用的顏色,所以實際的彩色調色盤將小於 

如果想知道這些值是如何得到的,請參考下面檔案格式的部份。

由於儲存演算法本身決定的因素,根據幾個圖像參數的不同計算出的大小與實際的檔案大小將會有一些細小的差別。

檔案格式

點陣圖圖檔由若干大小固定(檔案頭)和大小可變的結構體按一定的順序構成。由於該檔案格式幾經演進,這些結構體的版本也很多。

點陣圖檔案由以下結構體依次構成:

結構體名稱 可選 大小 用途 備註
點陣圖檔案頭 14位元組 儲存點陣圖檔案通用資訊 僅在讀取檔案時有用
DIB頭 固定(存在7種不同版本) 儲存點陣圖詳細資訊及像素格式 緊接在點陣圖檔案頭後
附加位遮罩 3或4 DWORD(12或16位元組) 定義像素格式 僅在DIB頭是BITMAPINFOHEADER時存在
調色盤 見備註 可變 定義圖像數據(像素陣列)所用顏色 色深≤ 8時不能省略
填充區A 可變 結構體對齊 點陣圖檔案頭中像素陣列偏移量的產物
像素陣列 可變 定義實際的像素數值 像素數據在DIB頭和附加位遮罩中定義。像素陣列中每行均以4位元組對齊
填充區B 可變 結構體對齊 DIB頭中ICC色彩特性數據偏移量的產物
ICC色彩特性數據 可變 定義色彩特性 可以包含外部檔案路徑,由該檔案來定義色彩特性

下面的部份將會詳細地描述點陣圖檔案中儲存的數據。需要注意的是這是標準點陣圖的檔案格式,其他一些點陣圖圖像可能根據生成檔案的應用程式不同所使用格式可能會有細微的區別。

點陣圖檔案頭

這部份數據塊位於檔案開頭,用於進行檔案的辨識。典型的應用程式會首先普通讀取這部份數據以確保的確是點陣圖檔案並且沒有損壞。所有的整數值都以小端序存放(即最低有效位前置)。

偏移量 大小 用途
0000h 2位元組 用於標識BMP和DIB檔案的魔數,一般為0x42 0x4D,即ASCII的BM。以下為可能的取值:
  • BM – Windows 3.1x, 95, NT, ... etc.
  • BA – OS/2 struct Bitmap Array
  • CI – OS/2 struct Color Icon
  • CP – OS/2 const Color Pointer
  • IC – OS/2 struct Icon
  • PT – OS/2 Pointer
0002h 4位元組 BMP檔案的大小(單位為位元組)
0006h 2位元組 保留;實際值因建立程式而異
0008h 2位元組 保留;實際值因建立程式而異
000Ah 4位元組 點陣圖數據(像素陣列)的地址偏移,也就是起始地址。

DIB頭

這部份告訴應用程式圖像的詳細資訊,在螢幕上顯示圖像將會使用這些資訊,它從檔案的第15個位元組開始。

這部份數據塊對應了Windows和OS/2中的內部使用的頭結構以及其它一些版本的變體。但所有版本均以一個DWORD位(32位元)開始,用以說明該數據區塊的大小,使得應用程式能夠根據這個大小來區分該圖像實際使用了哪種版本的DIB頭結構。

存在多種版本的頭結構的原因是微軟對DIB格式進行過多次擴充。下表即為所有不同版本的DIB頭:

大小 結構名稱 作業系統支援 所加特性
12 BITMAPCOREHEADER
OS21XBITMAPHEADER
OS/2和3.0版本以來的Windows
64 BITMAPCOREHEADER2
OS22XBITMAPHEADER
OS/2 添加半調網屏;添加RLE及霍夫曼1D壓縮。
40 BITMAPINFOHEADER Windows 3.0及更高版本 刪除RLE-24及霍夫曼1D壓縮;添加16/32位元像素格式;添加可選的RGB位遮罩。
52 BITMAPV2INFOHEADER Undocumented 刪除可選的RGB位遮罩;添加必選的RGB位遮罩。Adobe Photoshop
56 BITMAPV3INFOHEADER Not officially documented 添加必選的Alpha通道位遮罩。Adobe Photoshop
108 BITMAPV4HEADER Windows 95/NT4及更高版本 添加色彩空間類型和伽瑪校正
124 BITMAPV5HEADER Windows 98/2000及更高版本 添加ICC色彩特性

BITMAPCOREHEADER之後的版本都只是在前一版本結構末尾追加欄位。

出於相容性的考量,大多數應用程式使用較舊版本的DIB頭儲存檔案。在不考慮OS/2的情況下,目前通用的格式為BITMAPINFOHEADER版本,內容在下表中列出。除非有特殊說明,其中所有值均為無符號整數。

偏移量 大小(位元組) 用途
0Eh 4 該頭結構的大小(40位元組)
12h 4 點陣圖寬度,單位為像素(有符號整數)
16h 4 點陣圖高度,單位為像素(有符號整數)
1Ah 2 色彩平面數;只有1為有效值
1Ch 2 每個像素所佔位數,即圖像的色深。典型值為1、4、8、16、24和32
1Eh 4 所使用的壓縮方法,可取值見下表。
22h 4 圖像大小。指原始點陣圖數據的大小(詳見後文),與檔案大小不是同一個概念。
26h 4 圖像的橫向解像度,單位為像素每米(有符號整數)
2Ah 4 圖像的縱向解像度,單位為像素每米(有符號整數)
2Eh 4 調色盤的顏色數,為0時表示顏色數為預設的2色深
32h 4 重要顏色數,為0時表示所有顏色都是重要的;通常不使用本項

注意:BI_RGB圖像的圖像大小欄位可以為0。

壓縮方法欄位(位元組#30-33)的有效值如下表:

標識 壓縮方法 備註
0 BI_RGB 最常見
1 BI_RLE8 RLE 8位元/像素 只能用於格式為8位元/像素的點陣圖
2 BI_RLE4 RLE 4位元/像素 只能用於格式為4位元/像素的點陣圖
3 BI_BITFIELDS 位欄位或者霍夫曼1D壓縮(BITMAPCOREHEADER2) 像素格式由位遮罩指定,或點陣圖經過霍夫曼1D壓縮(BITMAPCOREHEADER2)
4 BI_JPEG JPEG或RLE-24壓縮(BITMAPCOREHEADER2) 點陣圖包含JPEG圖像或經過RLE-24壓縮(BITMAPCOREHEADER2)
5 BI_PNG PNG 點陣圖包含PNG圖像
6 BI_ALPHABITFIELDS 位欄位 針對Windows CE .NET 4.0及之後版本

注意:BI_JPEG和BI_PNG僅對印表機驅動有效,不支援螢幕彩現。

除此之外,OS/2的BITMAPCOREHEADER頭也不鮮見:

偏移量 大小(位元組) 用途
0Eh 4 該頭結構的大小(12位元組)
12h 2 點陣圖寬度,單位為像素
14h 2 點陣圖高度,單位為像素
16h 2 色彩平面數;只有1為有效值
18h 2 每個像素所佔位數。典型值為1、4、8和24

注意:OS/2 BITMAPCOREHEADER的點陣圖都是未壓縮的,而且不能是16或32位元/像素。OS/2 BITMAPCOREHEADER中的所有值均為無符號整數。

調色盤

這部份定義了圖像中所用的顏色。如上所述,點陣圖圖像一個像素接着一個像素儲存,每個像素使用一個或者多個位元組的值表示,所以調色盤的目的就是要告訴應用程式這些值所對應的實際顏色。

典型的點陣圖檔案使用RGB彩色模型。在這種模型中,每種顏色都是由不同強度(從0到最大強度)的紅色(R)、綠色(G)和藍色(B)組成的,也就是說,每種顏色都可以使用紅色、綠色和藍色的值所定義。

在點陣圖檔案的實現中,調色盤可以包含很多條目,條目個數就是圖像中所使用的顏色的個數。

typedef struct tagRGBQUAD {
    BYTE rgbBlue;
    BYTE rgbGreen;
    BYTE rgbRed;
    BYTE rgbReserved;
}   RGBQUAD;

每個條目用來描述一種顏色,包含4個位元組,其中三個表示藍色、綠色和紅色,第四個位元組沒有使用(大多數應用程式將它設為0);對於每個位元組,數值0表示該顏色分量在當前的顏色中沒有使用,而數值255表示這種顏色分量使用最大的強度。

像素儲存

表示點陣圖中像素的位元是以行為單位對齊儲存的,每一行的大小都向上取整為4位元組(32位元DWORD)的倍數。如果圖像的高度大於1,多個經過填充實現對齊的行就形成了像素陣列

完整儲存的一行像素所需的位元組數可以通過這個公式計算:

 
ImageWidth以像素為單位

像素陣列

這部份逐個像素表示圖像。每個像素使用一個或者多個位元組表示。

通常,像素是從下到上、從左到右儲存的。但如果使用的不是BITMAPCOREHEADER,那麼未壓縮的Windows點陣圖還可以從上到下儲存,此時圖像高度為負值。

每一行的末尾通過填充若干個位元組的數據(並不一定為0)使該行的長度為4位元組的倍數。像素陣列讀入主記憶體後,每一行的起始地址必須為4的倍數。這個限制僅針對主記憶體中的像素陣列,針對儲存時,僅要求每一行的大小為4位元組的倍數,對檔案的偏移沒有限制。

例如:對於24位元色的點陣圖,如果它的寬度為1像素,那麼除了每一行的數據(藍、綠、紅)需要佔3位元組外,還會填充1位元組;而如果寬為2像素,則需要2位元組的填充;寬為3像素時,需要3位元組填充;寬為4像素時則不需要填充。

圖像相同的條件下,點陣圖圖檔通常比使用其它壓縮演算法的圖檔大很多。

壓縮

索引色圖像可以使用4位元或8位元RLE霍夫曼1D演算法壓縮。

OS/2 BITMAPCOREHEADER2 24位元色圖像則可以使用24位元RLE演算法壓縮。

16位元色與32位元色圖像始終為未壓縮數據。

如果需要,任何色深的圖像都可以以未壓縮形式儲存。

像素格式

無論是磁碟上的點陣圖檔案還是主記憶體中的點陣圖圖像,像素都由一組位(英語:bit)表示。

  • 每像素佔1位(色深為1位,1bpp)的格式支援2種不同顏色。像素值直接對應一個位的值,最左像素對應第一個位元組的最高位。使用該位的值用來對色表的索引:為0表示色表中的第一項,為1表示色表中的第二項(即最後一項)。
  • 每像素佔2位(色深為2位,2bpp)的格式支援4種不同顏色。每個位元組對應4個像素,最左像素為最高的兩位(僅在Windows CE中有效)。需要使用像素值來對一張含有4個顏色值的色表進行索引。
  • 每像素佔4位(色深為4位元,4bpp)的格式支援16種不同的顏色。每個位元組對應2個像素,最左像素為最高的四位。需要使用像素值來對一張含有16個顏色值的色表進行索引。
  • 每像素佔8位(色深為8位元,8bpp)的格式支援256種不同的顏色。每個位元組對應1個像素。需要使用像素值來對一張含有256個顏色值的色表進行索引。
  • 每像素佔16位(色深為16位元,16bpp)的格式支援65536種不同的顏色,每2個位元組(byte)對應一個像素。該像素的不透明度(英語:alpha)、紅、綠、藍採樣值即儲存在該2個位元組中。
  • 每像素佔24位元(色深為24位元,24bpp)的格式支援16777216種不同的顏色,每3個位元組對應一個像素。
  • 每像素佔32位(色深為32位元,32bpp)的格式支援4294967296種不同的顏色,每4個位元組對應一個像素。

為了區分一個顏色值中的哪些位表示哪種採樣值,DIB頭給出了一套預設規則,同時也允許使用BITFIELDS將某組位指定為像素中的某個通道

其他

儘管檔案大小比較大,但是點陣圖檔案的簡單性、在微軟視窗和其他地方的廣泛使用以及這種格式的優秀文件標準以及沒有專利約束,使得它成為其他作業系統圖像處理程式能夠讀寫的一種最為常用的格式。

X Window System使用類似的.XBM格式表示一位黑白圖像以及.XPMpixelmap)表示彩色圖像。另外還有一種.RAW格式,它除了儲存原始數據之外沒有任何其他資訊。其他還有Portable Pixmap file format.PPM)和Truevision TGA.TGA),但是它們用得很少或者只用於特殊目的。儘管其他格式也儲存為「點陣圖」(與向量圖不同),但是它們使用數據壓縮或者顏色索引,所以它們不是嚴格意義上的點陣圖。

由於包含有冗餘資訊,許多BMP檔案使用類似於ZIP這樣的無失真數據壓縮演算法能夠取得很好的壓縮效果。

參見

參考文獻

  • Feng Yuan:《Windows Graphics Programming——Win32 GDI and DirectDraw》,Prentice Hall PTR, 1st ed.,2000-12-1,ISBN: 0-13-086985-6, 1234 pages. Chapter 10: Bitmap Basics; Chapter 11:Advanced Bitmap Graphics; Chapter 12:Image Processing Using Windows Bitmaps;

外部連結

  1. ^ IANA Considerations. Windows Image Media Types: sec. 5. RFC 7903.