2006 年 1 月 26 日 18 時 38 分

BMP まとめ #2


このアーカイブは同期化されません。 mixi の日記が更新されても、このアーカイブには反映されません。


今まで扱った BMP についてまとめてみる。
今日は、BMP ファイルの構造について。

BMP ファイルでは、多バイト長の整数を格納する際、
リトルエンディアンを利用してバイト化される。
例を挙げよう。32 ビット数値の、0x12345678 を、
リトルエンディアンで格納した場合、
バイト上での並びは、0x78, 0x56, 0x34, 0x12 の順となる。

ファイルの先頭には、14 バイトの BITMAPFILEHEADER がある。
最初の 2 バイトには、ASCII 文字で "BM"、
続く 4 バイトはファイル全体のサイズ、
続く 4 バイトは常に 0 であり、
最後の 4 バイトには、画像データ部の
ファイル先頭からのオフセット位置が入る。
BMP は、種類によってヘッダの数やサイズが異なるため、
便宜上、データに直接アクセスできる位置を格納してある。

次に来るのは、BITMAPINFOHEADER である。サイズは可変。
最初の 4 バイトはヘッダ自体のサイズが入る。通常は 40 だ。
次の 4 バイトは画像の横幅、次の 4 バイトは画像の高さ。
次の 2 バイトは 1 固定。そして次の 2 バイトには、
ピクセルあたりのビット数が入る。
後に続く 24 バイトは、とりあえず 0 と覚えておけばよい。

ピクセルあたり 16, 24, 32 ビットの BMP の場合、
必要なヘッダはこの 2 つで、54 バイトのサイズとなる。

ピクセルあたり 1, 4, 8 ビットの BMP の場合、
このあとに、カラーテーブルが続く。
各色は 32 ビットなので、カラーテーブルのサイズは、
1 ビットの場合、8 バイト、
4 ビットの場合、64 バイト、
8 ビットの場合、1024 バイトとなる。

ヘッダはこれで終わりだ。
この後ろに画素データが続くことになる。

画素データは、下から上への順番で格納される。
まずは最下行データがあり、最後に最上行データが来るのだ。

各行のデータは、基本的にピクセルを
左から右の順番に連続して格納したものである。
ピクセルが、8 ビット以下の場合、
バイト内では上位ビットから順に詰められる。
つまり、ピクセルあたり 1 ビットの場合、
1 バイトに、8 ピクセル分のデータが詰め込まれる。

ただ、1 行分のピクセルをまとめたデータが、
4 の倍数バイトに満たない場合、
最後に値 0 のビットが充填される。
つまり、行データは、常に 4 の倍数バイトのサイズとなる。

画素データの後には通常は何も続かず、ファイルの終端となる。

BMP のファイル構造上のポイントは以下の通り。

・多バイト格納はリトルエンディアン
・行単位の詰め物がある
・ボトムアップ(下から上)格納方式である
・一部のヘッダが可変長である

明日は、簡易フォトレタッチのほうへ少し歩んでみようかな。



Copyright (c) 1994-2007 Project Loafer. All rights reserved.