Updated on 2009-03-26 (木) 12:29:50 (5503d)

WindowsのBMPファイルのフォーマット

これは独自解析に基づくものです。 この情報を利用し、嬉しい事、悲しい事があっても私は一切責任を負いません。 BPP=8,24,32 の時はこれで読み書きできます。 画像データを直接吐き出すのに使えるでしょう。 あとの場合は知りません。自分で解析してください。

フォーマット表

  • □の一つが1バイトを表しています。
  • エンディアンは全てリトルです(つまり十進数で言えば1234という数が4321の順に格納される)。
オフセット(10進数)バイト数内容
0000□□"BM"の2文字(BMPファイルの識別子)
0002□□□□ファイルのバイト数(long int)
0006□□予約(=0)
0008□□予約(=0)
0010□□□□画像データ本体へのオフセット(long int)
 26: 下のヘッダサイズが12の場合
 54: 下のヘッダサイズが40の場合(通常)
 122: 下のヘッダサイズが108の場合
パレットデータの先頭ではなく、ピクセルデータの先頭らしい
0014□□□□BMP情報のヘッダサイズ(long int)
 12: シンプルなヘッダ
 40: 通常のヘッダ(通常)
 108: くどいヘッダ(知らん)
 ※ ヘッダの種類はここのサイズから判断する
0018□□□□画像の横ピクセル数(long int)
0022□□□□画像の縦ピクセル数(long int)
0026□□プレーン(レイヤー)の数(short int)
 1: 通常
0028□□BPP(ピクセル当りのビット数、Bit per Pixel)
0030□□□□圧縮モード(long int)
 0: 無圧縮のベタデータ
 1: RLE8
 2: RLE4
 3: ビットフィールド
0034□□□□データ本体の長さ(long int)
0038□□□□X方向(横)の解像度(Pixel per Meter, long int)
0042□□□□Y方向(縦)の解像度(Pixel per Meter, long int)
0046□□□□パレットの数(long int)
 0: BPPで表されるMAXの色数(例:24bppなら16M色)
 それ以外: 実際のパレット数(例:256など)
0050□□□□重要なパレットの数(long int)
 ※ 減色処理の参考にするらしい
0054□.....データの本体(パレット+画像)
 ※ 下記を参照

画像データの本体

ピクセルデータは画面上で下側のラインから上のラインへと格納されています。 1ラインの中では左から右です。 なお、1ライン分のデータは合計で4の倍数のバイト数となるよう、 最後の部分に0を入れて調節する必要があります。

  • この4の倍数というタコな制限のせいで、私は2時間をムダにしました。さすがMS。
  • 1ピクセルの中は、BGRになっています。おそらく、RGBAをリトルエンディアンにするのに合わせてあるのでしょう。

パレットがある場合

4バイト一組のデータがパレット数の分だけ並んでいます。 中身は各一バイトでそのパレットの色要素を表し、BGRXの順で格納されます。 RGBではない点に注意(Xはゴミだが、たいていはゼロ)。 このパレットデータの後ろに、以下の画像本体が続きます。

パレットがない場合

  • bpp=8: そのままベタデータ(=パレット番号)が並びます
  • bpp=24: BGRの順で3バイトずつ各ピクセルのデータが並びます
  • bpp=32: BGRXの順で4バイトずつ各ピクセルのデータが並びます(Xはゴミ)

ファイルサイズ

24ビットモード、横縦が640x480の画像の場合、ファイルサイズは

3 x 640 x 480 + 54 = 921654

となります。また 24ビットモード、横縦が320x240の画像の場合は

3 x 320 x 240 + 54 = 230454

になります(ともに通常のヘッダでパレットなしの場合)。

ダンプコマンド

  • UNIX系であれば
    od -uC BMPファイル名
    とすれば、下のような中身が見れてうれしいでしょう。
    0000000    66  77  54  26 163   0   0   0   0   0  54   4   0   0  40   0
    0000020     0   0 160  15   0   0 112  10   0   0   1   0   8   0   0   0
    0000040     0   0   0  22 163   0 109  11   0   0 109  11   0   0   0   0
    0000060     0   0   0   0   0   0   0   0   0   0   1   1   1   0   2   2
    0000100     2   0   3   3   3   0   4   4   4   0   5   5   5   0   6   6
    0000120     6   0   7   7   7   0   8   8   8   0   9   9   9   0  10  10
    0000140    10   0  11  11  11   0  12  12  12   0  13  13  13   0  14  14