Windows bitmap

マイクロソフトとIBMがWindowsとOS/2にわかれる前のOSを共同で開発していた頃に作られた画像ファイル形式
Windowsビットマップから転送)

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

Windows bitmap
拡張子.bmp
.dib[1][2]
MIMEタイプ image/bmp[3]
image/x-bmp
タイプコード'BMP '
'BMPf'
'BMPp'
UTIcom.microsoft.bmp
マジック
ナンバー
BM
開発者マイクロソフト
種別ビットマップ画像
オープン
フォーマット
はい。

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

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

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

ファイル構造 編集

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

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

主な構造 編集

OS/2 編集

1.12.x
BITMAPFILEHEADER構造体BITMAPFILEHEADER2構造体
BITMAPCOREHEADER構造体BITMAPINFOHEADER2構造体
カラーパレット(RGBTRIPLE構造体)カラーパレット(RGB2構造体)
画像データ

Windows 編集

3.0以降95以降98以降
BITMAPFILEHEADER構造体
BITMAPINFOHEADER構造体BITMAPV4HEADER構造体BITMAPV5HEADER構造体
カラーマスク

(ビットフィールド形式のみ)

カラーパレット(RGBQUAD構造体)
カラーパレット(RGBQUAD構造体)画像データ
画像データN/Aカラープロファイル

ファイルヘッダ 編集

BITMAPFILEHEADER 編集

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

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

参考URL

BITMAPFILEHEADER2 編集

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

オフセットサイズ格納する情報値・備考
0x00002バイトファイルタイプBM (0x42, 0x4d)(ビットマップ)
IC (0x49, 0x43)(モノクロアイコン)
CI (0x43, 0x49)(カラーアイコン)
PT (0x50, 0x54)(モノクロポインタ)
CP (0x43, 0x50)(カラーポインタ)
0x00024バイトヘッダサイズファイルヘッダと情報ヘッダの合計サイズを格納する。単位はバイト。
0x00062バイトホットスポットxポインタのホットスポットのx座標
0x0008ホットスポットyポインタのホットスポットのy座標
0x000a4バイトオフセットファイルヘッダの先頭アドレスからビットマップデータの先頭アドレスまでのオフセット。単位はバイト。
  • モノクロアイコン、モノクロポインタは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ヘッダと呼ばれる。

オフセットサイズ格納する情報値・備考
0x000e4バイトヘッダサイズ12
0x00122バイトビットマップの横幅単位はピクセル
0x0014ビットマップの縦幅
0x0016プレーン数常に1
0x00181ピクセルあたりのビット数1,4,8,24

参考URL

(スパムフィルターに引っかかるためアドレス@を入れています。@を除くこと)

BITMAPINFOHEADER 編集

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

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

参考URL

BITMAPINFOHEADER2 編集

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

オフセットサイズ格納する情報値・備考
0x000e4バイトヘッダサイズ16~64(可変長)
0x0012ビットマップの横幅単位はピクセル
0x0016ビットマップの縦幅
0x001a2バイトプレーン数常に1
0x001c1ピクセルあたりのビット数1,4,8,24
0x001e4バイト圧縮形式0(非圧縮),1(8bit RLE),2(4bit RLE),3(1bitハフマン符号圧縮),4(24bit RLE)
0x0022画像データサイズ単位はバイト。非圧縮の場合は0を入れても良い
0x0026水平方向の解像度単位は「解像度の単位」で指定される
0x002a垂直方向の解像度
0x002e使用する色数ビットマップで実際に使用するカラーパレット内のカラーインデックスの数。
0x0032重要な色数ビットマップを表示するために必要なカラーインデックスの数。
0x00362バイト解像度の単位0(ピクセル/m)
0x0038予約領域常に0
0x003a記録方式0(ボトムアップ)
0x003cハーフトーンの方式0(ハーフトーンなし), 1(誤差拡散法), 2(PANDA), 3(Super Circle)
0x003e4バイトハーフトーン時のパラメータ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と同等)」以外は用意されなかった。

BITMAPV3INFOHEADER 編集

Adobe Photoshopで使用されていた情報ヘッダ。infoヘッダにRGBとα成分のカラーマスクを取り込んだ56バイトのヘッダで、便宜上V3ヘッダと呼ばれる。また、infoヘッダにRGB成分のカラーマスクを取り込んだ52バイトの情報ヘッダも存在し、こちらは便宜上V2ヘッダと呼ばれる。

Adobe社によると、V2ヘッダ及びV3ヘッダの仕様は、過去にMicrosoftから取り寄せた文書に記載されていたそうである[5]

BITMAPV4HEADER 編集

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

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

参考URL

BITMAPV5HEADER 編集

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

オフセットサイズ格納する情報値・備考
0x000e4バイトヘッダサイズ124
0x0012ビットマップの横幅infoヘッダと同等
0x0016ビットマップの縦幅
0x001a2バイトプレーン数
0x001c1ピクセルあたりのビット数
0x001e4バイト圧縮形式
0x0022画像データサイズ
0x0026水平方向の解像度
0x002a垂直方向の解像度
0x002e使用する色数
0x0032重要な色数
0x0036赤成分のカラーマスクV4ヘッダと同等
0x003a緑成分のカラーマスク
0x003e青成分のカラーマスク
0x0042α成分のカラーマスク
0x0046色空間0(ヘッダ内で定義), 0x73524742('sRGB'), 0x57696e20('Win '), 0x4c494e4b('LINK'), 0x4d424544('MBED')
0x004a36バイトCIEXYZTRIPLE構造体V4ヘッダと同等
0x006e4バイト赤成分のガンマ値
0x0072緑成分のガンマ値
0x0076青成分のガンマ値
0x007aレンダリングの意図1,2,4,8
0x007eプロファイルデータのオフセット情報ヘッダの先頭アドレスからプロファイルデータの先頭アドレスまでのオフセット。単位はバイト
0x0082プロファイルデータのサイズ単位はバイト
0x0086予約領域常に0

参考URL

各フィールドの詳細 編集

プレーン数 編集

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

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

圧縮形式 編集

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

#識別子
0無圧縮BI_RGB
18ビット/ピクセル RLEBI_RLE8
24ビット/ピクセル RLEBI_RLE4
3ビットフィールドBI_BITFIELDS
4JPEG画像BI_JPEG
5PNG画像BI_PNG

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

#OS・環境識別子
31ビットハフマン符号化OS/2 2.xBCA_HUFFMAN1D
424ビット/ピクセル RLEBCA_RLE24
6アルファチャンネル付きビットフィールドWindows CE 5.0BI_ALPHABITFIELDS
7詳細不明Windows CEBI_FOURCC
11無圧縮CMYK?BI_CMYK
128ビット/ピクセル RLE CMYKBI_CMYKRLE8
134ビット/ピクセル RLE CMYKBI_CMYKRLE4
0x8000これは画像の回転角が送信先と同じであるというフラグ情報であり、圧縮形式ではない。Windows CE 5.0BI_SRCPREROTATE
FourCCによる指定DirectXなど
水平・垂直方向の解像度 編集

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

色空間 編集

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

カラーマスク 編集

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

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

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

カラーマスク16ビット32ビット
赤成分0x00007C000x00FF0000
緑成分0x000003E00x0000FF00
青成分0x0000001F0x000000FF
α成分0x000000000x00000000

カラーパレット 編集

このブロックは、画像内で使用される色を定義している。上述の通り、ビットマップ画像はピクセルごとに保存されている。各ピクセルは、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に関するメディアがあります。

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