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ではトップダウン形式のビットマップの作成を推奨していない。また、トップダウン形式では後述の圧縮をすることができない。
なお、ビットマップという呼称は画像データの表現方式のひとつであり、本項で述べているマイクロソフト独自のファイル形式を必ずしも指すわけではない[4]。
ファイル構造
ビットマップファイルは、以下のブロックに分かれている。
- ファイルヘッダ
- ビットマップファイルについての一般的な情報が格納されている。
- 情報ヘッダ
- ビットマップイメージについての詳細な情報が格納されている。
- カラーマスク
- ビットフィールド形式のビットマップで使用されるデータが格納される。
- カラーパレット
- インデックスカラービットマップの場合に使用される色の定義が格納されている。
- ダイレクトカラービットマップの場合は減色時に優先される色が格納される。
- ビットマップデータ
- 実際のイメージがピクセルごとに格納されている。
- カラープロファイル
- ICCプロファイルデータそのものか、プロファイルデータのファイルパスが格納される。
Diag. 1 – Windows BMP形式の画像の構造
主な構造
OS/2
1.1
|
2.x
|
BITMAPFILEHEADER構造体
|
BITMAPFILEHEADER2構造体
|
BITMAPCOREHEADER構造体
|
BITMAPINFOHEADER2構造体
|
カラーパレット(RGBTRIPLE構造体)
|
カラーパレット(RGB2構造体)
|
画像データ
|
Windows
3.0以降
|
95以降
|
98以降
|
BITMAPFILEHEADER構造体
|
BITMAPINFOHEADER構造体
|
BITMAPV4HEADER構造体
|
BITMAPV5HEADER構造体
|
カラーマスク
(ビットフィールド形式のみ)
|
カラーパレット(RGBQUAD構造体)
|
カラーパレット(RGBQUAD構造体)
|
画像データ
|
画像データ
|
N/A
|
カラープロファイル
|
ファイルヘッダ
14バイトからなる、ビットマップファイルのファイルヘッダである。
オフセット |
サイズ |
格納する情報 |
値・備考
|
0x0000 |
2バイト |
ファイルタイプ |
常にBM (0x42, 0x4d)(マジックナンバー)
|
0x0002 |
4バイト |
ファイルサイズ |
ビットマップファイルのサイズを格納する(単位はバイト)。
|
0x0006 |
2バイト |
予約領域1 |
常に0
|
0x0008 |
予約領域2
|
0x000a |
4バイト |
オフセット |
ファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット(単位はバイト)。
|
参考URL
OS/2 2.xで使用されたファイルヘッダ。BITMAPFILEHEADERを拡張したものだがサイズは同じ。
オフセット |
サイズ |
格納する情報 |
値・備考
|
0x0000 |
2バイト |
ファイルタイプ |
BM (0x42, 0x4d)(ビットマップ) IC (0x49, 0x43)(モノクロアイコン) CI (0x43, 0x49)(カラーアイコン) PT (0x50, 0x54)(モノクロポインタ) CP (0x43, 0x50)(カラーポインタ)
|
0x0002 |
4バイト |
ヘッダサイズ |
ファイルヘッダと情報ヘッダの合計サイズを格納する。単位はバイト。
|
0x0006 |
2バイト |
ホットスポットx |
ポインタのホットスポットのx座標
|
0x0008 |
ホットスポットy |
ポインタのホットスポットのy座標
|
0x000a |
4バイト |
オフセット |
ファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット。単位はバイト。
|
- モノクロアイコン、モノクロポインタは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
OS/2のビットマップで使われる情報ヘッダで、12バイトある。coreヘッダと呼ばれる。
オフセット |
サイズ |
格納する情報 |
値・備考
|
0x000e |
4バイト |
ヘッダサイズ |
12
|
0x0012 |
2バイト |
ビットマップの横幅 |
単位はピクセル
|
0x0014 |
ビットマップの縦幅
|
0x0016 |
プレーン数 |
常に1
|
0x0018 |
1ピクセルあたりのビット数 |
1,4,8,24
|
参考URL
(スパムフィルターに引っかかるためアドレスに@を入れています。@を除くこと)
Windowsのビットマップで使われる情報ヘッダで、40バイトある。多くのビットマップがこの形式で保存されている。infoヘッダと呼ばれる。
オフセット |
サイズ |
格納する情報 |
値・備考
|
0x000e |
4バイト |
ヘッダサイズ |
40
|
0x0012 |
ビットマップの横幅 |
単位はピクセル
|
0x0016 |
ビットマップの縦幅 |
単位はピクセル。値が負の場合はトップダウン画像となる
|
0x001a |
2バイト |
プレーン数 |
常に1
|
0x001c |
1ピクセルあたりのビット数 |
0,1,4,8,16,24,32
|
0x001e |
4バイト |
圧縮形式 |
0,1,2,3,4,5 ※1
|
0x0022 |
画像データサイズ |
単位はバイト
|
0x0026 |
水平方向の解像度 |
単位はピクセル/m
|
0x002a |
垂直方向の解像度
|
0x002e |
使用する色数 |
ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。
|
0x0032 |
重要な色数 |
ビットマップを表示するために必要なカラーインデックスの数。
|
参考URL
OS/2 V2以降対応した情報ヘッダである。サイズは可変であり、最大64バイト。Windowsでは対応していない。
[1]
オフセット |
サイズ |
格納する情報 |
値・備考
|
0x000e |
4バイト |
ヘッダサイズ |
16~64(可変長)
|
0x0012 |
ビットマップの横幅 |
単位はピクセル
|
0x0016 |
ビットマップの縦幅
|
0x001a |
2バイト |
プレーン数 |
常に1
|
0x001c |
1ピクセルあたりのビット数 |
1,4,8,24
|
0x001e |
4バイト |
圧縮形式 |
0(非圧縮),1(8bit RLE),2(4bit RLE),3(1bitハフマン符号圧縮),4(24bit RLE)
|
0x0022 |
画像データサイズ |
単位はバイト。非圧縮の場合は0を入れても良い
|
0x0026 |
水平方向の解像度 |
単位は「解像度の単位」で指定される
|
0x002a |
垂直方向の解像度 |
|
0x002e |
使用する色数 |
ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。
|
0x0032 |
重要な色数 |
ビットマップを表示するために必要なカラーインデックスの数。
|
0x0036 |
2バイト |
解像度の単位 |
0(ピクセル/m)
|
0x0038 |
予約領域 |
常に0
|
0x003a |
記録方式 |
0(ボトムアップ)
|
0x003c |
ハーフトーンの方式 |
0(ハーフトーンなし), 1(誤差拡散法), 2(PANDA), 3(Super Circle)
|
0x003e |
4バイト |
ハーフトーン時のパラメータ1 |
|
0x0042 |
ハーフトーン時のパラメータ2 |
誤差拡散法の場合は無視される
|
0x0046 |
符号化方式 |
0(RGB2、RGBQUADに相当)
|
0x004a |
識別子 |
アプリケーションが独自に使用してもよい領域
|
各フィールドの詳細
各フィールドの解説を、infoヘッダとの比較を交えながら行う
- ヘッダサイズ
- 16~64の可変長である。64未満の場合、後ろは0で埋められているとして扱われる。40の場合はinfoヘッダとほぼ同じとして扱える。
- ビットマップの縦幅
- infoヘッダではトップダウンとして扱われる負の値(-1~-2147483648)が、こちらでは正の値(4294967295~2147483648)として扱われる。記録する方向は「記録方式」で指定できるが、デフォルトの「ボトムアップ」以外は用意されなかった。
- 圧縮形式
- infoヘッダとは3~4の圧縮形式が異なるが、ビット深度を求めることにより判別は可能である。
- 水平方向の解像度
- 垂直方向の解像度
- 単位は「解像度の単位」で指定するが、デフォルトの「ピクセル/m」以外は用意されなかった。
- 符号化方式
- カラーパレットの形式を指定する。ただし、デフォルトの「RGB2(RGBQUADと同等)」以外は用意されなかった。
Adobe Photoshopで使用されていた情報ヘッダ。infoヘッダにRGBとα成分のカラーマスクを取り込んだ56バイトのヘッダで、便宜上V3ヘッダと呼ばれる。
また、infoヘッダにRGB成分のカラーマスクを取り込んだ52バイトの情報ヘッダも存在し、こちらは便宜上V2ヘッダと呼ばれる。
Adobe社によると、V2ヘッダ及びV3ヘッダの仕様は、過去にMicrosoftから取り寄せた文書に記載されていたそうである[5]。
Windows 95、Windows NT 4.0から対応した情報ヘッダ。V4ヘッダと呼ばれる。
オフセット |
サイズ |
格納する情報 |
値・備考
|
0x000e |
4バイト |
ヘッダサイズ |
108
|
0x0012 |
ビットマップの横幅 |
infoヘッダと同等
|
0x0016 |
ビットマップの縦幅
|
0x001a |
2バイト |
プレーン数
|
0x001c |
1ピクセルあたりのビット数
|
0x001e |
4バイト |
圧縮形式
|
0x0022 |
画像データサイズ
|
0x0026 |
水平方向の解像度
|
0x002a |
垂直方向の解像度
|
0x002e |
使用する色数
|
0x0032 |
重要な色数
|
0x0036 |
赤成分のカラーマスク |
|
0x003a |
緑成分のカラーマスク |
|
0x003e |
青成分のカラーマスク |
|
0x0042 |
α成分のカラーマスク |
|
0x0046 |
色空間 |
0(ヘッダ内で定義)
|
0x004a |
36バイト |
CIEXYZTRIPLE構造体 |
色空間が0の場合のみ有効
|
0x006e |
4バイト |
赤成分のガンマ値 |
色空間が0の場合のみ有効 16.16の固定小数点数
|
0x0072 |
緑成分のガンマ値
|
0x0076 |
青成分のガンマ値
|
参考URL
Windows 98、Windows 2000から対応した情報ヘッダ。V5ヘッダと呼ばれる。
オフセット |
サイズ |
格納する情報 |
値・備考
|
0x000e |
4バイト |
ヘッダサイズ |
124
|
0x0012 |
ビットマップの横幅 |
infoヘッダと同等
|
0x0016 |
ビットマップの縦幅
|
0x001a |
2バイト |
プレーン数
|
0x001c |
1ピクセルあたりのビット数
|
0x001e |
4バイト |
圧縮形式
|
0x0022 |
画像データサイズ
|
0x0026 |
水平方向の解像度
|
0x002a |
垂直方向の解像度
|
0x002e |
使用する色数
|
0x0032 |
重要な色数
|
0x0036 |
赤成分のカラーマスク |
V4ヘッダと同等
|
0x003a |
緑成分のカラーマスク
|
0x003e |
青成分のカラーマスク
|
0x0042 |
α成分のカラーマスク
|
0x0046 |
色空間 |
0(ヘッダ内で定義), 0x73524742('sRGB'), 0x57696e20('Win '), 0x4c494e4b('LINK'), 0x4d424544('MBED')
|
0x004a |
36バイト |
CIEXYZTRIPLE構造体 |
V4ヘッダと同等
|
0x006e |
4バイト |
赤成分のガンマ値
|
0x0072 |
緑成分のガンマ値
|
0x0076 |
青成分のガンマ値
|
0x007a |
レンダリングの意図 |
1,2,4,8
|
0x007e |
プロファイルデータのオフセット |
情報ヘッダの先頭アドレスからプロファイルデータの先頭アドレスまでのオフセット。単位はバイト
|
0x0082 |
プロファイルデータのサイズ |
単位はバイト
|
0x0086 |
予約領域 |
常に0
|
参考URL
各フィールドの詳細
プレーン数
過去に、EGAやVGAディスプレイカードで使われていた概念で、現在は全く使われない。
この概念が使われていた頃は、実際の色深度を「1ピクセルあたりのビット数×プレーン数」で算出する必要があった。
圧縮形式
※1 数値と定義されている圧縮形式の関係は以下の通り[6]
#
|
|
識別子
|
0
|
無圧縮
|
BI_RGB
|
1
|
8ビット/ピクセル RLE
|
BI_RLE8
|
2
|
4ビット/ピクセル RLE
|
BI_RLE4
|
3
|
ビットフィールド
|
BI_BITFIELDS
|
4
|
JPEG画像
|
BI_JPEG
|
5
|
PNG画像
|
BI_PNG
|
上記以外の圧縮形式は以下の通り
#
|
|
OS・環境
|
識別子
|
3
|
1ビットハフマン符号化
|
OS/2 2.x
|
BCA_HUFFMAN1D
|
4
|
24ビット/ピクセル RLE
|
BCA_RLE24
|
6
|
アルファチャンネル付きビットフィールド
|
Windows CE 5.0
|
BI_ALPHABITFIELDS
|
7
|
詳細不明
|
Windows CE
|
BI_FOURCC
|
11
|
無圧縮CMYK
|
?
|
BI_CMYK
|
12
|
8ビット/ピクセル RLE CMYK
|
BI_CMYKRLE8
|
13
|
4ビット/ピクセル RLE CMYK
|
BI_CMYKRLE4
|
0x8000
|
これは画像の回転角が送信先と同じであるというフラグ情報であり、圧縮形式ではない。
|
Windows CE 5.0
|
BI_SRCPREROTATE
|
|
FourCCによる指定
|
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
|
緑
|
赤
|
参考:
RGBQUAD
1色4バイトで表記する形式、OS/2ビットマップにおけるRGB2もこちらに相当する。
バイト数 |
情報 |
値・備考
|
1バイト |
青 |
0-255
|
緑
|
赤
|
予約領域
|
参考:
ビットマップデータ
このブロックは、イメージを各ピクセルごとに記述する。ピクセルは通常、左下から右下へ、これを下から上に向かって保存する。各ピクセルは1バイト以上で記述されている。直接RGBデータが置かれる場合のデータ順は、上項カラーパレットに準ずる。水平方向のバイト数が4の倍数ではないときは、0x00で埋めて4の倍数にする。
カラープロファイル
このブロックは、情報ヘッダの「色空間」が'LINK'の場合はカラープロファイルデータのファイルパスが、'MBED'の場合はデータそのものが格納される。
ファイルヘッダの「オフセット」の値によってはビットマップデータよりも前に格納することも出来る。
BMPを取り扱うプログラムライブラリ
プログラムでBMP画像を平易に扱うためのライブラリも数多く存在している。
- ビットマップデータを管理するオブジェクトハンドル。BMP形式画像をファイルやリソースから読み込んでHBITMAPを生成することのできる各種C言語形式関数が用意されている。Windowsデスクトップアプリケーション専用。
- マイクロソフトが提供している開発環境であるVisual C++に付属する、ビットマップ操作クラス。Win32 APIのラッパー。Windowsデスクトップアプリケーション専用。
- マイクロソフトが提供している開発環境であるVisual C++に付属する、ビットマップ操作クラス。Win32 APIおよびGDI+のラッパー。Windowsデスクトップアプリケーション専用。
- Windows SDKに付属する、C++言語専用のビットマップ操作クラス。Windowsデスクトップアプリケーション専用。
- COMベースの画像ライブラリ。Windowsデスクトップアプリケーション/Windowsストアアプリから利用可能。
- GDI+のマネージラッパー。Windowsデスクトップアプリケーション専用。
- Monoにも互換実装が存在する[12]。
- WICのマネージラッパー。Windowsデスクトップアプリケーション/Windowsストアアプリから利用可能。
サードパーティ製のライブラリに関しての各詳細は、外部リンクの項に記載している。
脚注
関連項目
外部リンク
ウィキメディア・コモンズには、Windows bitmapに関するメディアがあります。