BMP
読み:ビーエムピー
外語:BMP: BitMaPs

 Microsoft WindowsOS/2の標準として使われている画像ファイルのフォーマットの一つ。
目次

概要
 データは、そのままの形式(ビットマップ)か、またはランレングス圧縮と呼ばれる単純な圧縮方式により格納される。
 この圧縮BMPは、そのアルゴリズムからRLEと呼ばれる。

特徴

構造
 BMPファイルは、次の構造を取る。
 整数はリトルエンディアンで記述されている。
 なお、注記がないものはMicrosoft Windowsのビットマップ形式について記している。OS/2 1.xはWindowsの構造と同じ(情報ヘッダーはBITMAPCOREHEADER構造体)だが、新しいもの(OS/2 2.0以降)は構造が変わっており互換性がないので注意が必要である。

ファイルヘッダー
 ファイルヘッダーは、次の情報からなる。
サイズ内容備考
2バイトマジックナンバー"BM"
4バイトビットマップのサイズバイト単位
2バイト予約済み領域10
2バイト予約済み領域20
4バイトイメージデータの開始地点開始位置(バイト)
 ビットマップのサイズが32ビットという仕様のため、4Giバイトを超えるビットマップを作ることは(厳密なエンコーダーには)できない。なお、このビットマップのサイズは信用してはならない。
 画像データは、特別な事情がなければヘッダーの直後から始まるので、「イメージデータの開始地点」は通常はファイルヘッダー(14バイト)と情報ヘッダー(BITMAPINFOHEADER構造体なら40バイト)の合計値(この場合は54)がそのまま格納される。

情報ヘッダー

ヘッダー種類
 情報ヘッダーには主たるものだけで4種類がある。種類は、構造体の最初にある構造体のサイズで判別する。
 基本的に、BITMAPCOREHEADER構造体以外は後方互換であり、前のものに対して上位互換である。

BITMAPCOREHEADER構造体
 OS/2 1.xで採用されているもの。この構造体は、次の情報からなる。
サイズ内容備考
4バイト構造体のサイズ12
2バイト横ピクセル数ピクセル単位
2バイト縦ピクセル数ピクセル単位
2バイトイメージのプレーン数1
2バイトピクセルあたりのビット数1、4、8、24
 この構造体を用いたBMPは、縦横のサイズの上限はそれぞれ65535ピクセルと他のタイプよりも小さい。
 また、扱えるピクセルあたりのビット数も1・4・8・24に限られるので注意が必要である。

BITMAPINFOHEADER構造体
 Windows 3.0以降で標準的に採用されているもの。Windowsのペイントで出力されるBMPの情報ヘッダーであり、BMPの標準ともいえる。
 この構造体は、次の情報からなる。
サイズ名称内容備考
4バイトbiSize構造体のサイズ40
4バイトbiWidth横ピクセル数ピクセル単位
4バイトbiHeight縦ピクセル数ピクセル単位
2バイトbiPlanesイメージのプレーン数1
2バイトbiBitCountピクセルあたりのビット数0、1、4、8、16、24、32
4バイトbiCompression圧縮方式方式番号
4バイトbiSizeImageイメージデータのサイズ無圧縮なら0でもよい
4バイトbiXPelsPerMeter水平解像度1mあたりのピクセル数
4バイトbiYPelsPerMeter垂直解像度1mあたりのピクセル数
4バイトbiClrUsed用いる色の数0ならピクセルあたりのビット数で表わせる最大色数
4バイトbiClrImportant表示に必要な色の数0なら全部必要
 ピクセルあたりのビット数は0・1・4・8・16・24・32である。もし0の場合、中身はJPEGかPNGである。この機能はWindows 98以降で採用されている。
 圧縮は、使えるピクセルあたりのビット数が限定されている。具体的にはランレングス圧縮なら4か8、ビットフィールド付き非圧縮形式なら16か32である。JPEG・PNGなら0と決まっている。そのため、24ビットBMPならここは必ず0となる。
 用いる色の数は、16ビット以上なら基本的に0にする。さもないと、後でカラーパレットを書かねばならなくなる。
 上から下へ向かうときは高さをマイナス1倍することにより表現する(トップダウン、後述)。

BITMAPV4HEADER構造体
 Windows 95Windows NT 4.0から導入された、新しい構造体である。
 この構造体は構造体のサイズは最大108。もし108より小さいならば後ろが削られる。この値は40より大きい(40のときはBITMAPINFOHEADER構造体と同じ)。
 この構造体は、次の情報からなる。
サイズ内容備考
4バイト構造体のサイズ108
4バイト横ピクセル数ピクセル単位
4バイト縦ピクセル数ピクセル単位
2バイトイメージのプレーン数1
2バイトピクセルあたりのビット数0、1、4、8、16、24、32
4バイト圧縮方式方式番号
4バイトイメージデータのサイズ無圧縮なら0でもよい
4バイト水平解像度1mあたりのピクセル数
4バイト垂直解像度1mあたりのピクセル数
4バイト用いる色の数0ならピクセルあたりのビット数で表わせる最大色数
4バイト表示に必要な色の数0なら全部必要
4バイト赤成分のカラーマスク 
4バイト緑成分のカラーマスク 
4バイト青成分のカラーマスク 
4バイトαチャンネルのマスク 
4バイト色空間タイプV4タイプではLCS_CALIBRATED_RGBのみ対応
12バイトCIEXYZ座標 赤2.30形式の固定小数点が3つ(x,y,z)
12バイトCIEXYZ座標 緑2.30形式の固定小数点が3つ(x,y,z)
12バイトCIEXYZ座標 青2.30形式の固定小数点が3つ(x,y,z)
4バイト赤 ガンマ値 
4バイト緑 ガンマ値 
4バイト青 ガンマ値 
 全要素が揃っている場合、ビットフィールドと同じ情報がもう出尽くしているため、16ビットBMP・32ビットBMPで圧縮方式は基本的に0である。

BITMAPV5HEADER構造体
 この構造体はWindows 98以降で導入された。
 この構造体は構造体のサイズは最大124。もし124より小さいならば後ろが削られる。この値は40より大きい(40のときはBITMAPINFOHEADER構造体と同じ)。
 この構造体は、次の情報からなる。
サイズ内容備考
4バイト構造体のサイズ124
4バイト横ピクセル数ピクセル単位
4バイト縦ピクセル数ピクセル単位
2バイトイメージのプレーン数1
2バイトピクセルあたりのビット数0、1、4、8、16、24、32
4バイト圧縮方式方式番号
4バイトイメージデータのサイズ無圧縮なら0でもよい
4バイト水平解像度1mあたりのピクセル数
4バイト垂直解像度1mあたりのピクセル数
4バイト用いる色の数0ならピクセルあたりのビット数で表わせる最大色数
4バイト表示に必要な色の数0なら全部必要
4バイト赤成分のカラーマスク 
4バイト緑成分のカラーマスク 
4バイト青成分のカラーマスク 
4バイトαチャンネルのマスク 
4バイト色空間タイプV4タイプではLCS_CALIBRATED_RGBのみ対応
12バイトCIEXYZ座標 赤2.30形式の固定小数点が3つ(x,y,z)
12バイトCIEXYZ座標 緑2.30形式の固定小数点が3つ(x,y,z)
12バイトCIEXYZ座標 青2.30形式の固定小数点が3つ(x,y,z)
4バイト赤 ガンマ値 
4バイト緑 ガンマ値 
4バイト青 ガンマ値 
4バイト色空間のタイプ"LINK"、"MBED"
4バイト色空間プロフィールオフセット 
4バイトプロフィールサイズ 
4バイト予約済み領域0
 全要素が揃っている場合、ビットフィールドと同じ情報がもう出尽くしているため、16ビットBMP・32ビットBMPで圧縮方式は基本的に0である。

ビットフィールド
 ビットフィールドは、次の全ての条件を満たす場合にのみ存在する。
 16ビット時はRGB555、32ビット時RGB888のときは圧縮タイプを0にして、このフィールドを省略できる。
 16ビット時のRGB555とは、カラーマスクが次の値である。
 32ビット時のRGB888とは、カラーマスクが次の値である。
 これは、RGBの各ビットマスクをそれぞれ4バイト整数で順に表現するだけである。
 例えば16ビットでRGB565ならR部分が0x0000f800、G部分が0x000007e0、B部分が0x0000001fである。

カラーパレット
 カラーパレットは、次の条件のいずれか一方または両方を満たす場合に存在する。
 COREタイプのときは、B成分の値、G成分の値、R成分の値(それぞれ1バイトの整数)の順に並ぶ必要な数の色(1ビットなら2色、4ビットなら16色、8ビットなら256色)を列挙する。
 それ以外では、B成分の値、G成分の値、R成分の値、予約済み部分(必ず0)(それぞれ1バイトの整数)の順に並ぶ必要な色の値(指定されていなければ1ビットなら2色、4ビットなら16色、8ビットなら256色、指定されていればその色数)を列挙する。

イメージデータ
 1行ごとに原則下から上に向かって並ぶ。ただしBITMAPINFOHEADER構造体以上の構造体を情報ヘッダーに持ち、なおかつ高さの値が負の時は、上から下に並ぶ。
 各行はピクセルデータが並んでいる。もし各行が4バイトの倍数でない場合は余ったビットに0を格納する。
 各ピクセルのデータはビット数が1・4・8のときはパレット方式、16・32のときはビットフィールド方式、24のときはB成分・G成分・R成分がそれぞれ1バイトずつ並ぶカラータイプ方式である。

特殊な形式

biCompression
 BITMAPINFOHEADERなどにある圧縮方式を表わす番号欄は、次のいずれかが指定される。
 BI_RGB (0)
 BI_RLE8 (1)
 BI_RLE4 (2)
 BI_BITFIELDS (3)
 BI_JPEG (4)
 BI_PNG (5)
 一般的な無圧縮は0である。ランレングス圧縮(RLE)は、4ビットカラー用が2、8ビットカラー用が1、となる。
 3つまりBI_BITFIELDSの場合、圧縮はされていないがカラーマスクが設定されている。16ビットカラーまたは32ビットカラーの場合のみ有効である。
 これら以外では、FOURCCと呼ばれる4バイトの文字列によって種別を特定する。

トップダウン
 通常のBMPは、左から右、下から上に向かって保存されており、これをボトムアップDIBという。
 biHeight(縦ピクセル数)の値が負の場合、方向が上から下に保存されるトップダウンDIBとなるが、対応する処理系は限られている。
 色空間がYUV(YCrCb)の場合などは、biHeightの符号にかかわらず常にトップダウンとなる。処理系は正負いずれの値でもその絶対値を用い、トップダウンとして処理を受け付ける必要がある。
 なお、圧縮フォーマットではbiHeightはイメージの方向にかかわらず必ず正の値を用いる。

YUV(YCrCb)
 通常のBMPの色空間はRGBである。
 biCompressionでYUV(YCrCb)を指定すれば、BMPファイルにYUV(YCrCb)で画像を記録することも可能である。
 YUVにもいろいろあるが、フォーマットに応じたFOURCCをbiCompressionに指定することになる。たとえばYUV 4:2:2なら"UYVY"や"Y422"などとするのが一般的である。
 基本的なFOURCCはFOURCC.orgに登録されており、フォーマットなどについても情報がある。

再検索