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

Windows

ファイルヘッダ

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

参考URL
 BITMAPFILEHEADER (wingdi.h) - Win32 apps | Microsoft Docs

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

 モノクロアイコン、モノクロポインタは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ヘッダと呼ばれる。

参考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ヘッダと呼ばれる。

参考URL
 BITMAPINFOHEADER (wingdi.h) | Microsoft Docs

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

各フィールドの詳細
各フィールドの解説を、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ヘッダと呼ばれる。

参考URL
 BITMAPV4HEADER (wingdi.h) | Microsoft Docs

BITMAPV5HEADER 
Windows 98、Windows 2000から対応した情報ヘッダ。V5ヘッダと呼ばれる。

参考URL
 BITMAPV5HEADER (wingdi.h) | Microsoft Docs

各フィールドの詳細

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

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

圧縮形式 
※1 数値と定義されている圧縮形式の関係は以下の通り

上記以外の圧縮形式は以下の通り

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

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

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

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

1ピクセルあたりのビット数とカラーマスクの組み合わせが以下である場合は、圧縮形式を非圧縮に設定し、カラーマスクブロックを省略できる。

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

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

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

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

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

参考:
 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ストアアプリから利用可能。

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

脚注

関連項目 
 ファイルフォーマット
 ビットマップ画像

外部リンク 
 libbmp24 C++で書かれたオープンソースライブラリ。1つのヘッダーファイルのみで構成されており組み込みが容易。
 Imager Perl用モジュール。ほとんどの画像形式に対応しており、他ライブラリとの依存も少なく高速に動作する画像ライブラリ。

画像ファイルフォーマット
ラスターグラフィックス・ファイルフォーマット