BMP 取自點陣圖 Bitmap 的縮寫，也稱為 DIB（與裝置無關的點陣圖），是一種獨立於顯示器的點陣圖數字影像檔案格式。常見於微軟視窗和 OS2 作業系統，Windows GDI API 內部使用的 DIB 資料結構與 BMP 檔案格式幾乎相同。 影像通常儲存的顏色深度有 2（1 位）、16（4 位）、256（8 位）、65536（16 位）和約 1677 萬（24 位）種顏色（其中位是表示每點所用的資料位）。8 點陣圖像可以是索引彩色影像外，也可以是灰階影像。表示的 alpha 通道也可以儲存在一個類似於灰階影像的獨立檔案中。帶有整合的 alpha 通道的 32 位版本已經隨著 Windows XP 出現，它在 Windows 系統的登入介面和系統主題中都有使用。 儲存演算法 BMP 檔案通常是不壓縮的，所以它們通常比同一幅影像的壓縮影像檔案格式要大很多。例如，一個 800600 的 24 位幾乎佔據 14MB 空間。因此它們通常不適合在因特網或者其他低速或者有容量限制的媒介上進行傳輸。 根據顏色深度的不同，影像上的一個畫素可以用一個或者多個位元組表示，它由 n8 所確定（n 是位深度，1 位元組包含 8 個數據位）。圖片瀏覽器等基於位元組的 ASCII 值計算畫素的顏色，然後從調色盤中讀出相應的值。更為詳細的資訊請參閱下面關於點陣圖檔案的部分。 n 位 2n 種顏色的包含調色盤的點陣圖近似位元組數可以用下面的公式計算： BMP 檔案大小 approx 544 cdot 2nfrac rm width cdot rm height cdot n8，其中高度（height）和寬度（width）都以畫素為單位。 需要注意的是上面公式中的 54 是點陣圖檔案的，4 cdot 2n 是彩色調色盤的大小。 如果點陣圖檔案不包含調色盤，如 24 位，32 位點陣圖，則點陣圖的近似位元組數可以用下面的公式計算： BMP 檔案大小 approx 54frac rm width cdot rm height cdot n8，其中高度（height）和寬度（width）都以畫素為單位。 另外需要注意的是這是一個近似值，對於 n 位的點陣圖影像來說，儘管可能有最多 2n 種顏色，一個特定的影像可能並不會使用這些所有的顏色。由於彩色調色盤僅僅定義了影像所用的顏色，所以實際的彩色調色盤將小於 4 cdot 2n。 如果想知道這些值是如何得到的，請參考下面檔案格式的部分。 由於儲存演算法本身決定的因素，根據幾個影像引數的不同計算出的大小與實際的檔案大小將會有一些細小的差別。 檔案格式 點陣圖影像檔案由若干大小固定（檔案頭）和大小可變的結構體按一定的順序構成。由於該檔案格式幾經演進，這些結構體的版本也很多。 點陣圖檔案由以下結構體依次構成： 結構體名稱 可選 大小 用途 備註 點陣圖檔案頭 否 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 31x 95 NT etc BA OS2 struct Bitmap Array CI OS2 struct Color Icon CP OS2 const Color Pointer IC OS2 struct Icon PT OS2 Pointer 0002h 4 位元組 BMP 檔案的大小（單位為位元組） 0006h 2 位元組 保留；實際值因建立程式而異 0008h 2 位元組 保留；實際值因建立程式而異 000Ah 4 位元組 點陣圖資料（畫素陣列）的地址偏移，也就是起始地址。 DIB 頭 這部分告訴應用程式影像的詳細資訊，在螢幕上顯示影像將會使用這些資訊，它從檔案的第 15 個位元組開始。 這部分資料塊對應了 Windows 和 OS2 中的內部使用的頭結構以及其它一些版本的變體。但所有版本均以一個 DWORD 位（32 位）開始，用以說明該資料區塊的大小，使得應用程式能夠根據這個大小來區分該影像實際使用了哪種版本的 DIB 頭結構。 存在多種版本的頭結構的原因是微軟對 DIB 格式進行過多次擴充。下表即為所有不同版本的 DIB 頭： 大小 結構名稱 zhcn 作業系統支援；zhhant 作業系統支援 所加特性 12 BITMAPCOREHEADEROS21XBITMAPHEADER OS2 和 30 版本以來的 Windows 64 BITMAPCOREHEADER2OS22XBITMAPHEADER OS2 新增半調網屏；新增 RLE 及霍夫曼 1D 壓縮。 40 BITMAPINFOHEADER Windows 30 及更高版本 刪除 RLE24 及霍夫曼 1D 壓縮；新增 1632 位畫素格式；新增可選的 RGB 位掩碼。 52 BITMAPV2INFOHEADER Undocumented 刪除可選的 RGB 位掩碼；新增必選的 RGB 位掩碼。Adobe Photoshop 56 BITMAPV3INFOHEADER Not officially documented 新增必選的 Alpha 通道位掩碼。Adobe Photoshop 108 BITMAPV4HEADER Windows 95NT4 及更高版本 新增色彩空間型別和伽瑪校正。 124 BITMAPV5HEADER Windows 982000 及更高版本 新增 ICC 色彩特性。 BITMAPCOREHEADER 之後的版本都只是在前一版本結構末尾追加欄位。 出於相容性的考量，大多數應用程式使用較舊版本的 DIB 頭儲存檔案。在不考慮 OS2 的情況下，目前通用的格式為 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。 壓縮方法欄位（位元組 3033）的有效值如下表： 值 標識 壓縮方法 備註 0 BI_RGB 無 最常見 1 BI_RLE8 RLE 8 位 畫素 只能用 zhcn 於；zhhant 於 格式為 8 位 畫素的點陣圖 2 BI_RLE4 RLE 4 位 畫素 只能用 zhcn 於；zhhant 於 格式為 4 位 畫素的點陣圖 3 BI_BITFIELDS 位欄位或者霍夫曼 1D 壓縮（BITMAPCOREHEADER2） 畫素格式由位掩碼指定，或點陣圖經過霍夫曼 1D 壓縮（BITMAPCOREHEADER2） 4 BI_JPEG JPEG 或 RLE24 壓縮（BITMAPCOREHEADER2） 點陣圖包含 JPEG 影像或經過 RLE24 壓縮（BITMAPCOREHEADER2） 5 BI_PNG PNG 點陣圖包含 PNG 影像 6 BI_ALPHABITFIELDS 位欄位 針對 Windows CE NET 40 及之後版本 注意：BI_JPEG 和 BI_PNG 僅對印表機驅動有效，不支援螢幕渲染。 除此之外，OS2 的 BITMAPCOREHEADER 頭也不鮮見： 偏移量 大小（位元組） 用途 0Eh 4 該頭結構的大小（12 位元組） 12h 2 點陣圖寬度，單位為畫素 14h 2 點陣圖高度，單位為畫素 16h 2 色彩平面數；只有 1 為有效值 18h 2 每個畫素所佔位數。典型值為 1、4、8 和 24 注意：OS2 BITMAPCOREHEADER 的點陣圖都是未壓縮的，而且不能是 16 或 32 位 畫素。OS2 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，多個經過填充實現對齊的行就形成了畫素陣列。 完整儲存的一行畫素所需的位元組數可以透過這個公式計算： mbox RowSize leftlfloorfrac mbox BitsPerPixel cdot mbox ImageWidth31 32rightrfloor cdot 4 ImageWidth 以畫素為單位 畫素陣列 這部分逐個畫素表示影像。每個畫素使用一個或者多個位元組表示。 通常，畫素是從下到上、從左到右儲存的。但如果使用的不是 BITMAPCOREHEADER，那麼未壓縮的 Windows 點陣圖還可以從上到下儲存，此時影像高度為負值。 每一行的末尾透過填充若干個位元組的資料（並不一定為 0）使該行的長度為 4 位元組的倍數。畫素陣列讀入記憶體後，每一行的起始地址必須為 4 的倍數。這個限制僅針對記憶體中的畫素陣列，針對儲存時，僅要求每一行的大小為 4 位元組的倍數，對檔案的偏移沒有限制。 例如：對於 24 位色的點陣圖，如果它的寬度為 1 畫素，那麼除了每一行的資料（藍、綠、紅）需要佔 3 位元組外，還會填充 1 位元組；而如果寬為 2 畫素，則需要 2 位元組的填充；寬為 3 畫素時，需要 3 位元組填充；寬為 4 畫素時則不需要填充。 影像相同的條件下，點陣圖影像檔案通常比使用其它壓縮演算法的影像檔案大很多。 壓縮 索引色影像可以使用 4 位或 8 位 RLE 或霍夫曼 1D 演算法壓縮。 OS2 BITMAPCOREHEADER2 24 位色影像則可以使用 24 位 RLE 演算法壓縮。 16 位色與 32 位色影像始終為未壓縮資料。 如果需要，任何色深的影像都可以以未壓縮形式儲存。 畫素格式 無論是磁碟上的點陣圖檔案還是記憶體中的點陣圖影像，畫素都由一組位表示。 每畫素佔 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）對應一個畫素。該畫素的不透明度、紅、綠、藍取樣值即儲存在該 2 個位元組中。 每畫素佔 24 位（色深為 24 位，24bpp）的格式支援 16777216 種不同的顏色，每 3 個位元組對應一個畫素。 每畫素佔 32 位（色深為 32 位，32bpp）的格式支援 4294967296 種不同的顏色，每 4 個位元組對應一個畫素。 為了區分一個顏色值中的哪些位表示哪種取樣值，DIB 頭給出了一套預設規則，同時也允許使用 BITFIELDS 將某組位指定為畫素中的某個通道。 其他 儘管檔案大小比較大，但是點陣圖檔案的簡單性、在微軟視窗和其他地方的廣泛使用以及這種格式的優秀文件標準以及沒有專利約束，使得它成為其他作業系統影像處理程式能夠讀寫的一種最為常用的格式。 X Window System 使用類似的XBM 格式表示一位黑白影像以及XPM（pixelmap）表示彩色影像。另外還有一種RAW 格式，它除了儲存原始資料之外沒有任何其他資訊。其他還有 Portable Pixmap file format（PPM）和 Truevision TGA（TGA），但是它們用得很少或者只用於特殊目的。儘管其他格式也儲存為 點陣圖（與向量圖不同），但是它們使用資料壓縮或者顏色索引，所以它們不是嚴格意義上的點陣圖。 由於包含有冗餘資訊，許多 BMP 檔案使用類似於 ZIP 這樣的無損資料壓縮演算法能夠取得很好的壓縮效果。 參見 影像檔案格式比較 Windows Picture and Fax Viewer 參考文獻 Feng Yuan：《Windows Graphics ProgrammingWin32 GDI and DirectDraw》，Prentice Hall PTR， 1st ed，2000121，ISBN 0130869856 1234 pages Chapter 10 Bitmap Basics Chapter 11Advanced Bitmap Graphics Chapter 12Image Processing Using Windows Bitmaps 外部連結 Microsofts MSDN page on Bitmaps Bitmap Storage Explanation Bitmap File Structure An introduction to DIBs Device Independent Bitmaps Example BMP images with various internal formats Turbo C 30 Code to open 16color bitmaps in DOS 點陣圖（Bitmap）檔案格式 by chiapei Category 圖形檔案格式