Windows bitmap

BMP（ビーエムピー、Microsoft Windows Bitmap Image）またはDIB（ディーアイビー、Device Independent Bitmap、デバイス独立ビットマップ）は、マイクロソフトとIBMがWindowsとOS/2にわかれる前のOSを共同で開発していた頃に作られた画像ファイル形式。圧縮の方法についても定義されているが、Windowsが標準では無圧縮のファイルを生成するため、他のアプリケーションにおいても無指定時は、圧縮はされていない場合が多い。

ファイル形式の細部の変更が何度か行われており、その結果としてWindowsとOS/2で多少ファイル形式が異なることがある。

機械独立のファイル形式として設計されたため、実際に存在する画像表示装置（ディスプレイ）や印刷装置（プリンター）が、画像を上方から処理するものがほぼ全てであるにもかかわらず、幾何学的なX軸、Y軸方向に座標を指定する形式となっている。その結果、画像を下から上に向かって記録するボトムアップ形式 (bottom-up) となっていることが特徴であるが、後に高さに負の値を指定することでその他大多数の画像ファイル形式と同じように画像を上から下へ向かって記録するトップダウン形式 (top-down) を使用することもできるようになった。しかし互換性の面からProgramming Windowsではトップダウン形式のビットマップの作成を推奨していない。また、トップダウン形式では後述の圧縮をすることができない。

なお、ビットマップという呼称は画像データの表現方式のひとつであり、本項で述べているマイクロソフト独自のファイル形式を必ずしも指すわけではない。

 ファイル構造 
ビットマップファイルは、以下のブロックに分かれている。
ファイルヘッダ
ビットマップファイルについての一般的な情報が格納されている。
情報ヘッダ
ビットマップイメージについての詳細な情報が格納されている。
カラーマスク
ビットフィールド形式のビットマップで使用されるデータが格納される。
カラーパレット
インデックスカラービットマップの場合に使用される色の定義が格納されている。
ダイレクトカラービットマップの場合は減色時に優先される色が格納される。
ビットマップデータ
実際のイメージがピクセルごとに格納されている。
カラープロファイル
ICCプロファイルデータそのものか、プロファイルデータのファイルパスが格納される。

 主な構造 

 OS/2 
1.12.xBITMAPFILEHEADER構造体BITMAPFILEHEADER2構造体BITMAPCOREHEADER構造体BITMAPINFOHEADER2構造体カラーパレット（RGBTRIPLE構造体）カラーパレット（RGB2構造体）画像データ

 Windows 
+3.0以降95以降98以降BITMAPFILEHEADER構造体BITMAPINFOHEADER構造体BITMAPV4HEADER構造体BITMAPV5HEADER構造体カラーマスク
（ビットフィールド形式のみ）カラーパレット（RGBQUAD構造体）カラーパレット（RGBQUAD構造体）画像データ画像データN/Aカラープロファイル

 ファイルヘッダ 

 BITMAPFILEHEADER 
14バイトからなる、ビットマップファイルのファイルヘッダである。

オフセットサイズ格納する情報値・備考0x00002バイトファイルタイプ常にBM (0x42, 0x4d)（マジックナンバー）0x00024バイトファイルサイズビットマップファイルのサイズを格納する（単位はバイト）。0x00062バイト予約領域1常に00x0008予約領域20x000a4バイトオフセットファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット（単位はバイト）。
参考URL
 BITMAPFILEHEADER (wingdi.h) - Win32 apps | Microsoft Docs

 BITMAPFILEHEADER2 
OS/2 2.xで使用されたファイルヘッダ。BITMAPFILEHEADERを拡張したものだがサイズは同じ。

オフセットサイズ格納する情報値・備考0x00002バイトファイルタイプBM (0x42, 0x4d)（ビットマップ）IC (0x49, 0x43)（モノクロアイコン）CI (0x43, 0x49)（カラーアイコン）PT (0x50, 0x54)（モノクロポインタ）CP (0x43, 0x50)（カラーポインタ）0x00024バイトヘッダサイズファイルヘッダと情報ヘッダの合計サイズを格納する。単位はバイト。0x00062バイトホットスポットxポインタのホットスポットのx座標0x0008ホットスポットyポインタのホットスポットのy座標0x000a4バイトオフセットファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット。単位はバイト。
 モノクロアイコン、モノクロポインタは1bitモノクロ画像のみサポートしている。
 カラーアイコン、カラーポインタは1ファイル内に透過位置を示す1bitモノクロ画像とカラー情報を表す画像を併せ持つ特殊なファイル構造をしている。

 情報ヘッダ 
このブロックは、アプリケーションが画像を描画するための画像の詳細な情報が書かれており、14バイト目から始まる。

14-17 (eh-11h) バイト目は、ヘッダのサイズが書かれている。最大値は、
 40 - Windows V3
 108 - Windows V4
 124 - Windows V5
 12 - OS/2 V1
 64 - OS/2 V2

 BITMAPCOREHEADER 
OS/2のビットマップで使われる情報ヘッダで、12バイトある。coreヘッダと呼ばれる。

オフセットサイズ格納する情報値・備考0x000e4バイトヘッダサイズ120x00122バイトビットマップの横幅単位はピクセル0x0014ビットマップの縦幅0x0016プレーン数常に10x00181ピクセルあたりのビット数1,4,8,24
参考URL
 BITMAPCOREHEADER (wingdi.h) - Win32 apps | Microsoft Docs
 http://www.programmers@heaven.com/mb/graphics/148346/152845/re-planes/?S=B20000
（スパムフィルターに引っかかるためアドレスに@を入れています。@を除くこと）

 BITMAPINFOHEADER 
Windowsのビットマップで使われる情報ヘッダで、40バイトある。多くのビットマップがこの形式で保存されている。infoヘッダと呼ばれる。

オフセットサイズ格納する情報値・備考0x000e4バイトヘッダサイズ400x0012ビットマップの横幅単位はピクセル0x0016ビットマップの縦幅単位はピクセル。値が負の場合はトップダウン画像となる0x001a2バイトプレーン数常に10x001c1ピクセルあたりのビット数0,1,4,8,16,24,320x001e4バイト圧縮形式0,1,2,3,4,5 ※10x0022画像データサイズ単位はバイト0x0026水平方向の解像度単位はピクセル/m0x002a垂直方向の解像度0x002e使用する色数ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。0x0032重要な色数ビットマップを表示するために必要なカラーインデックスの数。
参考URL
 BITMAPINFOHEADER (wingdi.h) | Microsoft Docs

 BITMAPINFOHEADER2 
OS/2 V2以降対応した情報ヘッダである。サイズは可変であり、最大64バイト。Windowsでは対応していない。

オフセットサイズ格納する情報値・備考0x000e4バイトヘッダサイズ16～64（可変長）0x0012ビットマップの横幅単位はピクセル0x0016ビットマップの縦幅0x001a2バイトプレーン数常に10x001c1ピクセルあたりのビット数1,4,8,240x001e4バイト圧縮形式0（非圧縮）,1（8bit RLE）,2（4bit RLE）,3（1bitハフマン符号圧縮）,4（24bit RLE）0x0022画像データサイズ単位はバイト。非圧縮の場合は0を入れても良い0x0026水平方向の解像度単位は「解像度の単位」で指定される0x002a垂直方向の解像度0x002e使用する色数ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。0x0032重要な色数ビットマップを表示するために必要なカラーインデックスの数。0x00362バイト解像度の単位0（ピクセル/m）0x0038予約領域常に00x003a記録方式0（ボトムアップ）0x003cハーフトーンの方式0（ハーフトーンなし）, 1（誤差拡散法）, 2（PANDA）, 3（Super Circle）0x003e4バイトハーフトーン時のパラメータ10x0042ハーフトーン時のパラメータ2誤差拡散法の場合は無視される0x0046符号化方式0（RGB2、RGBQUADに相当）0x004a識別子アプリケーションが独自に使用してもよい領域

各フィールドの詳細
各フィールドの解説を、infoヘッダとの比較を交えながら行う
ヘッダサイズ
16～64の可変長である。64未満の場合、後ろは0で埋められているとして扱われる。40の場合はinfoヘッダとほぼ同じとして扱える。
ビットマップの縦幅
infoヘッダではトップダウンとして扱われる負の値（-1～-2147483648）が、こちらでは正の値（4294967295～2147483648）として扱われる。記録する方向は「記録方式」で指定できるが、デフォルトの「ボトムアップ」以外は用意されなかった。
圧縮形式
infoヘッダとは3～4の圧縮形式が異なるが、ビット深度を求めることにより判別は可能である。
水平方向の解像度
垂直方向の解像度
単位は「解像度の単位」で指定するが、デフォルトの「ピクセル/m」以外は用意されなかった。
符号化方式
カラーパレットの形式を指定する。ただし、デフォルトの「RGB2（RGBQUADと同等）」以外は用意されなかった。

 BITMAPV3INFOHEADER 
Adobe Photoshopで使用されていた情報ヘッダ。infoヘッダにRGBとα成分のカラーマスクを取り込んだ56バイトのヘッダで、便宜上V3ヘッダと呼ばれる。
また、infoヘッダにRGB成分のカラーマスクを取り込んだ52バイトの情報ヘッダも存在し、こちらは便宜上V2ヘッダと呼ばれる。

Adobe社によると、V2ヘッダ及びV3ヘッダの仕様は、過去にMicrosoftから取り寄せた文書に記載されていたそうである。

 BITMAPV4HEADER 
Windows 95、Windows NT 4.0から対応した情報ヘッダ。V4ヘッダと呼ばれる。
オフセットサイズ格納する情報値・備考0x000e4バイトヘッダサイズ1080x0012ビットマップの横幅infoヘッダと同等0x0016ビットマップの縦幅0x001a2バイトプレーン数0x001c1ピクセルあたりのビット数0x001e4バイト圧縮形式0x0022画像データサイズ0x0026水平方向の解像度0x002a垂直方向の解像度0x002e使用する色数0x0032重要な色数0x0036赤成分のカラーマスク0x003a緑成分のカラーマスク0x003e青成分のカラーマスク0x0042α成分のカラーマスク0x0046色空間0(ヘッダ内で定義)0x004a36バイトCIEXYZTRIPLE構造体色空間が0の場合のみ有効0x006e4バイト赤成分のガンマ値色空間が0の場合のみ有効16.16の固定小数点数0x0072緑成分のガンマ値0x0076青成分のガンマ値
参考URL
 BITMAPV4HEADER (wingdi.h) | Microsoft Docs

 BITMAPV5HEADER 
Windows 98、Windows 2000から対応した情報ヘッダ。V5ヘッダと呼ばれる。
オフセットサイズ格納する情報値・備考0x000e4バイトヘッダサイズ1240x0012ビットマップの横幅infoヘッダと同等0x0016ビットマップの縦幅0x001a2バイトプレーン数0x001c1ピクセルあたりのビット数0x001e4バイト圧縮形式0x0022画像データサイズ0x0026水平方向の解像度0x002a垂直方向の解像度0x002e使用する色数0x0032重要な色数0x0036赤成分のカラーマスクV4ヘッダと同等0x003a緑成分のカラーマスク0x003e青成分のカラーマスク0x0042α成分のカラーマスク0x0046色空間0(ヘッダ内で定義), 0x73524742('sRGB'), 0x57696e20('Win '), 0x4c494e4b('LINK'), 0x4d424544('MBED')0x004a36バイトCIEXYZTRIPLE構造体V4ヘッダと同等0x006e4バイト赤成分のガンマ値0x0072緑成分のガンマ値0x0076青成分のガンマ値0x007aレンダリングの意図1,2,4,80x007eプロファイルデータのオフセット情報ヘッダの先頭アドレスからプロファイルデータの先頭アドレスまでのオフセット。単位はバイト0x0082プロファイルデータのサイズ単位はバイト0x0086予約領域常に0
参考URL
 BITMAPV5HEADER (wingdi.h) | Microsoft Docs

 各フィールドの詳細 

 プレーン数 
過去に、EGAやVGAディスプレイカードで使われていた概念で、現在は全く使われない。

この概念が使われていた頃は、実際の色深度を「1ピクセルあたりのビット数×プレーン数」で算出する必要があった。

 圧縮形式 
※1 数値と定義されている圧縮形式の関係は以下の通り
#識別子0無圧縮BI_RGB18ビット/ピクセル RLEBI_RLE824ビット/ピクセル RLEBI_RLE43ビットフィールドBI_BITFIELDS4JPEG画像BI_JPEG5PNG画像BI_PNG
上記以外の圧縮形式は以下の通り
#OS・環境識別子31ビットハフマン符号化OS/2 2.xBCA_HUFFMAN1D424ビット/ピクセル RLEBCA_RLE246アルファチャンネル付きビットフィールドWindows CE 5.0BI_ALPHABITFIELDS7詳細不明Windows CEBI_FOURCC11無圧縮CMYK?BI_CMYK128ビット/ピクセル RLE CMYKBI_CMYKRLE8134ビット/ピクセル RLE CMYKBI_CMYKRLE40x8000これは画像の回転角が送信先と同じであるというフラグ情報であり、圧縮形式ではない。Windows CE 5.0BI_SRCPREROTATEFourCCによる指定DirectXなど

 水平・垂直方向の解像度 
画像の表示に適したデバイスの解像度を指定する。この値を設定することで、例えばソフトウェアが画面の解像度に合った最適なサイズの画像を選択できるようになる。

 色空間 
V4ヘッダで、'Win 'と'sRGB'が使用できるというドキュメントが存在する。

 カラーマスク 
カラーマスクはビットフィールド形式が使用されているビットマップから各色成分を取り出す際に使用されるデータである。赤成分、緑成分、青成分の順で書かれており、それぞれ4バイト、合計12バイトである。Windows CEで圧縮形式に「アルファチャンネル付きビットフィールド」を使用した場合は、この後ろにα成分のカラーマスクが置かれ合計16バイトになる。

カラーマスクブロックは、情報ヘッダがINFOヘッダかつビットフィールド形式が使用されている場合に必ず存在する。V4、V5ヘッダの場合は、ヘッダ内に値が格納されるためこのブロックは置く必要がない。

1ピクセルあたりのビット数とカラーマスクの組み合わせが以下である場合は、圧縮形式を非圧縮に設定し、カラーマスクブロックを省略できる。
カラーマスク 16ビット 32ビット 赤成分 0x00007C00 0x00FF0000 緑成分 0x000003E0 0x0000FF00 青成分 0x0000001F 0x000000FF α成分 0x00000000 0x00000000

 カラーパレット 
このブロックは、画像内で使用される色を定義している。上述の通り、ビットマップ画像はピクセルごとに保存されている。各ピクセルは、1バイト以上を使用して値を保持している。したがって、各値と実際の色の関係を、アプリケーションに教えることがカラーパレットの目的である。

典型的なビットマップファイルはRGBカラーモデルを使用している。このモデルにおいて、色は赤 (R)、緑 (G)、青 (B) のそれぞれの強さ (0-255) で表される。

 RGBTRIPLE 
1色3バイトで表記する形式。情報ヘッダがcoreヘッダの場合のみ使用される。

バイト数情報値・備考1バイト青0-255緑赤

参考:
 RGBTRIPLE (wingdi.h) - Win32 apps | Microsoft Docs

 RGBQUAD 
1色4バイトで表記する形式、OS/2ビットマップにおけるRGB2もこちらに相当する。

バイト数情報値・備考1バイト青0-255緑赤予約領域

参考:
 RGBQUAD (wingdi.h) - Win32 apps | Microsoft Docs

 ビットマップデータ 
このブロックは、イメージを各ピクセルごとに記述する。ピクセルは通常、左下から右下へ、これを下から上に向かって保存する。各ピクセルは1バイト以上で記述されている。直接RGBデータが置かれる場合のデータ順は、上項カラーパレットに準ずる。水平方向のバイト数が4の倍数ではないときは、0x00で埋めて4の倍数にする。

 カラープロファイル 
このブロックは、情報ヘッダの「色空間」が'LINK'の場合はカラープロファイルデータのファイルパスが、'MBED'の場合はデータそのものが格納される。
ファイルヘッダの「オフセット」の値によってはビットマップデータよりも前に格納することも出来る。

 BMPを取り扱うプログラムライブラリ 

プログラムでBMP画像を平易に扱うためのライブラリも数多く存在している。
 Windows API (GDI), HBITMAP
 ビットマップデータを管理するオブジェクトハンドル。BMP形式画像をファイルやリソースから読み込んでHBITMAPを生成することのできる各種C言語形式関数が用意されている。Windowsデスクトップアプリケーション専用。
 Microsoft Foundation Class (MFC), CBitmapクラス
 マイクロソフトが提供している開発環境であるVisual C++に付属する、ビットマップ操作クラス。Win32 APIのラッパー。Windowsデスクトップアプリケーション専用。
 Active Template Library (ATL), ATL::CImageクラス
 マイクロソフトが提供している開発環境であるVisual C++に付属する、ビットマップ操作クラス。Win32 APIおよびGDI+のラッパー。Windowsデスクトップアプリケーション専用。
 GDI+, Gdiplus::Bitmapクラス
 Windows SDKに付属する、C++言語専用のビットマップ操作クラス。Windowsデスクトップアプリケーション専用。
 Windows Imaging Component (WIC)
 COMベースの画像ライブラリ。Windowsデスクトップアプリケーション/Windowsストアアプリから利用可能。
 .NET Framework, System.Drawing
 GDI+のマネージラッパー。Windowsデスクトップアプリケーション専用。
 Monoにも互換実装が存在する。
 .NET Framework, System.Windows.Media.Imaging
 WICのマネージラッパー。Windowsデスクトップアプリケーション/Windowsストアアプリから利用可能。

サードパーティ製のライブラリに関しての各詳細は、外部リンクの項に記載している。