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

Windows bitmap
拡張子 .bmp
MIMEタイプ image/bmp[1]
タイプコード 'BMP '
'BMPf'
'BMPp'
UTI com.microsoft.bmp
マジック
ナンバー
BM
開発者 マイクロソフト
種別 ビットマップ画像

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

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

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

目次

ファイル構造編集

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

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

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

オフセット サイズ 格納する情報 値・備考
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

BITMAPFILEHEADER2編集

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 2バイト ホットスポット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

BITMAPCOREHEADER編集

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

オフセット サイズ 格納する情報 値・備考
0x000e 4バイト ヘッダサイズ 12
0x0012 2バイト ビットマップの横幅 単位はピクセル
0x0014 2バイト ビットマップの縦幅 単位はピクセル
0x0016 2バイト プレーン数 常に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バイトある。多くのビットマップがこの形式で保存されている。infoヘッダと呼ばれる。

オフセット サイズ 格納する情報 値・備考
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以降対応した情報ヘッダである。サイズは可変であり、最大64バイト。 [1]

オフセット サイズ 格納する情報 値・備考
0x000e 4バイト ヘッダサイズ 16~64(可変長)
0x0012 4バイト ビットマップの横幅 単位はピクセル
0x0016 4バイト ビットマップの縦幅 単位はピクセル
0x001a 2バイト プレーン数 常に1
0x001c 2バイト 1ピクセルあたりのビット数 1,4,8,24
0x001e 4バイト 圧縮形式 0(非圧縮),1(8bit RLE),2(4bit RLE),3(1bitハフマン符号化),4(24bit RLE)
0x0022 4バイト 画像データサイズ 単位はバイト。非圧縮の場合は0を入れても良い
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(PANDA), 3(Super Circle)
0x003e 4バイト ハーフトーン時のパラメータ1
0x0042 4バイト ハーフトーン時のパラメータ2 誤差拡散法の場合は無視される
0x0046 4バイト 符号化方式 0(RGB2、RGBQUADに相当), -1(パレット方式)
0x004a 4バイト 識別子 アプリケーションが独自に使用してもよい領域


BITMAPV4HEADER編集

Windows 95、Windows NT 4.0から対応した情報ヘッダ。V4ヘッダと呼ばれる。

オフセット サイズ 格納する情報 値・備考
0x000e 4バイト ヘッダサイズ 108
0x0012 4バイト ビットマップの横幅 infoヘッダと同等
0x0016 4バイト ビットマップの縦幅
0x001a 2バイト プレーン数
0x001c 2バイト 1ピクセルあたりのビット数
0x001e 4バイト 圧縮形式
0x0022 4バイト 画像データサイズ
0x0026 4バイト 水平方向の解像度
0x002a 4バイト 垂直方向の解像度
0x002e 4バイト 使用する色数
0x0032 4バイト 重要な色数
0x0036 4バイト 赤成分のカラーマスク
0x003a 4バイト 緑成分のカラーマスク
0x003e 4バイト 青成分のカラーマスク
0x0042 4バイト α成分のカラーマスク
0x0046 4バイト 色空間 0(ヘッダ内で定義)
0x004a 36バイト CIEXYZTRIPLE構造体 色空間が0の場合のみ有効
0x006e 4バイト 赤成分のガンマ値 色空間が0の場合のみ有効
16.16の固定小数点数
0x0072 4バイト 緑成分のガンマ値
0x0076 4バイト 青成分のガンマ値

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

BITMAPV5HEADER編集

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

オフセット サイズ 格納する情報 値・備考
0x000e 4バイト ヘッダサイズ 124
0x0012 4バイト ビットマップの横幅 infoヘッダと同等
0x0016 4バイト ビットマップの縦幅
0x001a 2バイト プレーン数
0x001c 2バイト 1ピクセルあたりのビット数
0x001e 4バイト 圧縮形式
0x0022 4バイト 画像データサイズ
0x0026 4バイト 水平方向の解像度
0x002a 4バイト 垂直方向の解像度
0x002e 4バイト 使用する色数
0x0032 4バイト 重要な色数
0x0036 4バイト 赤成分のカラーマスク V4ヘッダと同等
0x003a 4バイト 緑成分のカラーマスク
0x003e 4バイト 青成分のカラーマスク
0x0042 4バイト α成分のカラーマスク
0x0046 4バイト 色空間 0(ヘッダ内で定義), 0x73524742('sRGB'), 0x57696e20('Win '), 0x4c494e4b('LINK'), 0x4d424544('MBED')
0x006a 36バイト CIEXYZTRIPLE構造体 V4ヘッダと同等
0x006e 4バイト 赤成分のガンマ値
0x0072 4バイト 緑成分のガンマ値
0x0076 4バイト 青成分のガンマ値
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

各フィールドの詳細編集

プレーン数編集

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

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

圧縮形式編集

※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)

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

  • 3 - 1ビットハフマン符号化(OS/2 2.x、識別子はHUFFMAN_1D)
  • 4 - 24ビット/ピクセル RLE(OS/2 2.x、識別子はRLE_24)
  • 6 - アルファチャンネル付きビットフィールド(Windows CE 5.0、識別子はBI_ALPHABITFIELDS)
色空間編集

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

カラーマスク編集

カラーマスクはビットフィールド形式が使用されているビットマップから各色成分を取り出す際に使用されるデータである。

カラーマスクブロックは、情報ヘッダがINFOヘッダかつビットフィールド形式が使用されている場合のみ存在する。 V4、V5ヘッダの場合は、ヘッダ内に値が格納されるためこのブロックは存在しない。カラーマスクは赤成分、緑成分、青成分の順で書かれており、それぞれ4バイト、合計12バイトである。α成分のカラーマスクは存在しない。

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

  16ビット 32ビット
赤成分のカラーマスク 0x00007C00 0x00FF0000
緑成分のカラーマスク 0x000003E0 0x0000FF00
青成分のカラーマスク 0x0000001F 0x000000FF

カラーパレット編集

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

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

RGBTRIPLE編集

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

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

RGBQUAD編集

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

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

ビットマップデータ編集

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

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デスクトップアプリケーション専用。
WICのマネージラッパー。Windowsデスクトップアプリケーション/Windowsストアアプリから利用可能。

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

脚注編集

関連項目編集

外部リンク編集

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