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
になります(ともに通常のヘッダでパレットなしの場合)。
ダンプコマンド †