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ではトップダウン形式のビットマップの作成を推奨していない。また、トップダウン形式では後述の圧縮をすることができない。
なお、ビットマップという呼称は画像データの表現方式のひとつであり、本項で述べている"マイクロソフト独自のファイル形式"を必ずしも指すわけではない。
ファイル構造.
ビットマップファイルは、以下のブロックに分かれている。
ファイルヘッダ.
BITMAPFILEHEADER.
14バイトからなる、ビットマップファイルのファイルヘッダである。
参考URL
BITMAPFILEHEADER2.
OS/2 2.xで使用されたファイルヘッダ。BITMAPFILEHEADERを拡張したものだがサイズは同じ。
情報ヘッダ.
このブロックは、アプリケーションが画像を描画するための画像の詳細な情報が書かれており、14バイト目から始まる。
14-17 (eh-11h) バイト目は、ヘッダのサイズが書かれている。最大値は、
BITMAPCOREHEADER.
OS/2のビットマップで使われる情報ヘッダで、12バイトある。coreヘッダと呼ばれる。
参考URL
（スパムフィルターに引っかかるためアドレスに@を入れています。@を除くこと）
BITMAPINFOHEADER.
Windowsのビットマップで使われる情報ヘッダで、40バイトある。多くのビットマップがこの形式で保存されている。infoヘッダと呼ばれる。
参考URL
BITMAPINFOHEADER2.
OS/2 V2以降対応した情報ヘッダである。サイズは可変であり、最大64バイト。Windowsでは対応していない。
各フィールドの詳細.
各フィールドの解説を、infoヘッダとの比較を交えながら行う
BITMAPV3INFOHEADER.
Adobe Photoshopで使用されていた情報ヘッダ。infoヘッダにRGBとα成分のカラーマスクを取り込んだ56バイトのヘッダで、便宜上V3ヘッダと呼ばれる。
また、infoヘッダにRGB成分のカラーマスクを取り込んだ52バイトの情報ヘッダも存在し、こちらは便宜上V2ヘッダと呼ばれる。
Adobe社によると、V2ヘッダ及びV3ヘッダの仕様は、過去にMicrosoftから取り寄せた文書に記載されていたそうである。
BITMAPV4HEADER.
Windows 95、Windows NT 4.0から対応した情報ヘッダ。V4ヘッダと呼ばれる。
参考URL
BITMAPV5HEADER.
Windows 98、Windows 2000から対応した情報ヘッダ。V5ヘッダと呼ばれる。
参考URL
各フィールドの詳細.
プレーン数.
過去に、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ヘッダの場合のみ使用される。
参考:
RGBQUAD.
1色4バイトで表記する形式、OS/2ビットマップにおけるRGB2もこちらに相当する。
参考:
ビットマップデータ.
このブロックは、イメージを各ピクセルごとに記述する。ピクセルは通常、左下から右下へ、これを下から上に向かって保存する。各ピクセルは1バイト以上で記述されている。直接RGBデータが置かれる場合のデータ順は、上項カラーパレットに準ずる。水平方向のバイト数が4の倍数ではないときは、0x00で埋めて4の倍数にする。
カラープロファイル.
このブロックは、情報ヘッダの「色空間」が'LINK'の場合はカラープロファイルデータのファイルパスが、'MBED'の場合はデータそのものが格納される。
ファイルヘッダの「オフセット」の値によってはビットマップデータよりも前に格納することも出来る。
BMPを取り扱うプログラムライブラリ.
プログラムでBMP画像を平易に扱うためのライブラリも数多く存在している。
サードパーティ製のライブラリに関しての各詳細は、外部リンクの項に記載している。