Windows bitmap

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

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

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

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

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

ファイル構造

ビットマップファイルは、以下のブロックに分かれている。

ファイルヘッダ
ビットマップファイルについての一般的な情報が格納されている。
情報ヘッダ
ビットマップイメージについての詳細な情報が格納されている。
カラーパレット
インデックスカラービットマップの場合に使用される色の定義が格納されている。
ビットマップデータ
実際のイメージがピクセルごとに格納されている。
ファイル:BMPfileFormat.png
Diag. 1 – Windows BMP形式の画像の構造

主な構造

OS/2 1.1

BITMAPFILEHEADER構造体
BITMAPCOREHEADER構造体
RGBTRIPLE構造体(インデックスカラー時)
画像データ

OS/2 2.x

BITMAPFILEHEADER2構造体
BITMAPINFOHEADER2構造体
RGB2構造体(インデックスカラー時)
画像データ

Windows 3.0以降

BITMAPFILEHEADER構造体
BITMAPINFOHEADER構造体
RGBQUAD構造体(インデックスカラー時)
画像データ

Windows 95以降採用

BITMAPFILEHEADER構造体
BITMAPV4HEADER構造体
RGBQUAD構造体(インデックスカラー時)
画像データ

Windows 98以降採用

BITMAPFILEHEADER構造体
BITMAPV5HEADER構造体
RGBQUAD構造体(インデックスカラー時)
画像データ

ファイルヘッダ

BITMAPFILEHEADER

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

オフセット サイズ 格納する情報 値・備考
0x0000 2 バイト ファイルタイプ 常にBM (0x42, 0x4d)マジックナンバー
0x0002 4 バイト ファイルサイズ ビットマップファイルのサイズを格納する(単位はバイト)。
0x0006 2 バイト 予約領域1 常に0
0x0008 2 バイト 予約領域2 常に0
0x000a 4 バイト オフセット ファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット(単位はバイト)。

参考URL http://msdn.microsoft.com/en-us/library/dd183374(VS.85).aspx

情報ヘッダ

このブロックは、アプリケーションが画像を描画するための画像の詳細な情報が書かれており、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バイトある。

オフセット サイズ 格納する情報 値・備考
0x000e 4 バイト ヘッダサイズ 12
0x0012 2 バイト ビットマップの横幅 単位はピクセル
0x0014 2 バイト ビットマップの縦幅 単位はピクセル
0x0016 2 バイト プレーン数※昔、EGAやVGAディスプレイカードで使われていた概念で、現在は全く使われない。 常に1
0x0018 2 バイト 1ピクセルあたりのビット数 1,4,8,24

参考URL http://msdn.microsoft.com/en-us/library/dd183372(VS.85).aspx http://www.programmers@heaven.com/mb/graphics/148346/152845/re-planes/?S=B20000 (スパムフィルターに引っかかるためアドレス@を入れています。@を除くこと)

BITMAPINFOHEADER

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

オフセット サイズ 格納する情報 値・備考
0x000e 4 バイト ヘッダサイズ 40
0x0012 4 バイト ビットマップの横幅 単位はピクセル
0x0016 4 バイト ビットマップの縦幅 単位はピクセル
0x001a 2 バイト プレーン数 常に1
0x001c 2 バイト 1ピクセルあたりのビット数 0,1,4,8,16,24,32
0x001e 4 バイト 圧縮形式 0,1,2,3,4,5※1
0x0022 4 バイト 画像データサイズ 単位はバイト
0x0026 4 バイト 水平方向の解像度 単位はピクセル/m
0x002a 4 バイト 垂直方向の解像度 単位はピクセル/m
0x002e 4 バイト 使用する色数 ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。
0x0032 4 バイト 重要な色数 ビットマップを表示するために必要なカラーインデックスの数。

参考URL http://msdn.microsoft.com/en-us/library/dd183376(VS.85).aspx

BITMAPINFOHEADER2

OS/2 V2以降対応した、新しい情報ヘッダで、64byteある。 [1]

オフセット サイズ 格納する情報 値・備考
0x000e 4 バイト ヘッダサイズ 64
0x0012 4 バイト ビットマップの横幅 単位はピクセル
0x0016 4 バイト ビットマップの縦幅 単位はピクセル
0x001a 2 バイト プレーン数 常に1
0x001c 2 バイト 1ピクセルあたりのビット数 0,1,4,8,16,24,32
0x001e 4 バイト 圧縮形式 0,1,2,3,4,5※1
0x0022 4 バイト 画像データサイズ 単位はバイト
0x0026 4 バイト 水平方向の解像度 単位はピクセル/m
0x002a 4 バイト 垂直方向の解像度 単位はピクセル/m
0x002e 4 バイト 使用する色数 ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。
0x0032 4 バイト 重要な色数 ビットマップを表示するために必要なカラーインデックスの数。
0x0036 2 バイト 解像度の単位 0(ピクセル/m)
0x0038 2 バイト 予約領域 常に0
0x003a 2 バイト 記録方式 0(ボトムアップ)
0x003c 2 バイト ハーフトーンの方式 0(ハーフトーンなし), 1(誤差拡散法), 2, 3
0x003e 4 バイト ハーフトーン時のパラメータ1
0x0042 4 バイト ハーフトーン時のパラメータ2 誤差拡散法の場合は無視される
0x0046 4 バイト 符号化方式 0(RGB2、RGBQUADに相当), -1(パレット方式)
0x004a 4 バイト 予約領域

テンプレート:節stub

BITMAPV4HEADER

Windows 95、Windows NT 4.0から対応した新しい情報ヘッダ。

オフセット サイズ 格納する情報 値・備考
0x000e 4 バイト ヘッダサイズ 108
0x0012 4 バイト ビットマップの横幅 単位はピクセル
0x0016 4 バイト ビットマップの縦幅 単位はピクセル
0x001a 2 バイト プレーン数 常に1
0x001c 2 バイト 1ピクセルあたりのビット数 0,1,4,8,16,24,32
0x001e 4 バイト 圧縮形式 0,1,2,3,4,5※1
0x0022 4 バイト 画像データサイズ 単位はバイト
0x0026 4 バイト 水平方向の解像度 単位はピクセル/m
0x002a 4 バイト 垂直方向の解像度 単位はピクセル/m
0x002e 4 バイト 使用する色数 ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。
0x0032 4 バイト 重要な色数 ビットマップを表示するために必要なカラーインデックスの数。
0x0036 4 バイト 赤成分のカラーマスク
0x003a 4 バイト 緑成分のカラーマスク
0x003e 4 バイト 青成分のカラーマスク
0x0042 4 バイト α成分のカラーマスク
0x0046 4 バイト 色空間 0
0x004a 36 バイト CIEXYZTRIPLE構造体
0x006e 4 バイト 赤成分のガンマ値
0x0072 4 バイト 緑成分のガンマ値
0x0076 4 バイト 青成分のガンマ値

参考URL http://msdn.microsoft.com/en-us/library/dd183380(VS.85).aspx

BITMAPV5HEADER

Windows 98、Windows 2000から対応した新しい情報ヘッダ。

オフセット サイズ 格納する情報 値・備考
0x000e 4 バイト ヘッダサイズ 124
0x0012 4 バイト ビットマップの横幅 単位はピクセル
0x0016 4 バイト ビットマップの縦幅 単位はピクセル
0x001a 2 バイト プレーン数 常に1
0x001c 2 バイト 1ピクセルあたりのビット数 0,1,4,8,16,24,32
0x001e 4 バイト 圧縮形式 0,1,2,3,4,5※1
0x0022 4 バイト 画像データサイズ 単位はバイト
0x0026 4 バイト 水平方向の解像度 単位はピクセル/m
0x002a 4 バイト 垂直方向の解像度 単位はピクセル/m
0x002e 4 バイト 使用する色数 ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。
0x0032 4 バイト 重要な色数 ビットマップを表示するために必要なカラーインデックスの数。
0x0036 4 バイト 赤成分のカラーマスク
0x003a 4 バイト 緑成分のカラーマスク
0x003e 4 バイト 青成分のカラーマスク
0x0042 4 バイト α成分のカラーマスク
0x0046 4 バイト 色空間 0,0x73524742,0x57696e20,0x4c494e4b,0x4d424544
0x006a 36 バイト CIEXYZTRIPLE構造体
0x006e 4 バイト 赤成分のガンマ値 16.16の固定小数点数
0x0072 4 バイト 緑成分のガンマ値 16.16の固定小数点数
0x0076 4 バイト 青成分のガンマ値 16.16の固定小数点数
0x007a 4 バイト レンダリングの意図 1,2,4,8
0x007e 4 バイト プロファイルデータのオフセット 情報ヘッダの先頭アドレスからプロファイルデータの先頭アドレスまでのオフセット。単位はバイト
0x0082 4 バイト プロファイルデータのサイズ 単位はバイト
0x0086 4 バイト 予約領域 常に0

参考URL http://msdn.microsoft.com/en-us/library/dd183381(VS.85).aspx

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

0 - 無圧縮(識別子はBI_RGB)
1 - 8ビット/ピクセル RLE(識別子はBI_RLE8)
2 - 4ビット/ピクセル RLE(識別子はBI_RLE4)
3 - ビットフィールド(識別子はBI_BITFIELDS)
4 - JPEG画像(識別子はBI_JPEG)
5 - PNG画像(識別子はBI_PNG)

カラーパレット

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

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

RGBTRIPLE

1色3バイトで表記する形式

バイト数 情報 値・備考
1 byte 0-255
1 byte 0-255
1 byte 0-255

RGBQUAD

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

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

ビットマップデータ

このブロックは、イメージを各ピクセルごとに記述する。ピクセルは通常左から右へ、下から上に向かって保存されている。各ピクセルは1バイト以上で記述されている。もし水平方向のバイト数が4倍数ではないときは、Null (0x00) で埋めて4の倍数にする。

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

プログラムでBMP画像を平易に扱う為のライブラリも数多く存在している。各詳細は外部リンク項に記載。

注記

  1. より一般的な意味合いについてはビットマップ画像の項を参考。

関連項目

外部リンク

  • Win32API-CBitmap マイクロソフトが提供しているWindows向けビットマップ操作クラス。
  • libbmp24 C++で書かれたオープンソースライブラリ。1つのヘッダーファイルのみで構成されており組み込みが容易。
  • Imager perl ほとんどの画像形式に対応しており、他ライブラリとの依存も少なく高速に動作する画像ライブラリ。

テンプレート:圧縮フォーマット テンプレート:Graphics file formats