ビットマップファイルは、畫像の形式の一つで、無壓縮のものです。無壓縮なので當然ファイルサイズは大きくなります。ビットマップファイルの中身は、點毎の色データ(RGB形式かパレット形式かはファイルに依存する)の集合です。
最初に、OS/2、Windowsビットマップを問はないファイルヘッダがあり、サイズは14byteで固定です。
データの意味 | 占有バイト數 | 内容 |
---|---|---|
ファイルタイプ | 2byte | "BM"(ビットマップファイル識別子) |
ファイルサイズ(單位:byte) | 4byte | ファイルに依る |
豫約領域1 | 2byte | 常に0 |
豫約領域2 | 2byte | 常に0 |
ファイル先頭から畫像データまでのオフセット(單位:byte) | 4byte | ファイルに依る |
struct { unsigned short FileType; unsigned long FileSize; unsigned short Reserved1, Reserved2; unsigned long Offset; };
次に示す情報ヘッダはWindowsのbmp形式のファイル特有のもので、OS/2のものには存在しません。
データの意味 | 占有バイト數 | 内容 |
---|---|---|
情報ヘッダのサイズ(單位:byte) | 4byte | 40 |
畫像の幅(單位:pixel) | 4byte | 畫像に依る |
畫像の高さ(單位:pixel) | 4byte | 畫像に依る |
プレーン數 | 2byte | 常に1 |
1畫素當りのデータサイズ(單位:bit) | 2byte | 1,4,8,16,24,32のうちどれか(0の場合もある) |
壓縮形式 | 4byte | 0,1,2,3のうちどれか |
畫像データ部のサイズ(單位:byte) | 4byte | 畫像データのサイズ |
横方向解像度 | 4byte | 96dpiならば3780か0かどちらか |
縱方向解像度 | 4byte | 96dpiならば3780か0かどちらか |
格納されてゐるパレット數(使用色數) | 4byte | パレットを使ふならば、其の使用色數、使はないなら0 |
重要なパレットのインデックス | 4byte | 0の場合もある |
struct { unsigned long HeaderSize; long ImageWidth; long ImageHeight; unsigned short Planes; unsigned short BitPerPixel; unsigned long Compression; unsigned long ImageSize; long PixelPerMeterX; long PixelPerMeterY; unsigned long UseColors; unsigned long ImportantColors; };
1畫素當りのデータサイズが8以下の場合に存在します。
Windows Bitmapの場合、RGBは夫々1バイトで表され、1バイトのリザーブも付與されます。
struct { unsigned char Blue; unsigned char Green; unsigned char Red; unsigned char Reserved; };
Blue,Green,Redにはそれぞれ0〜255の値が入り、Reservedには固定で0が格納されます。
先に示した構造體の内容を、そのままファイルに連續して出力するだけです。幾つ出力するかは1畫素當りのデータサイズに依存します。
1畫素當りのデータサイズが1,4,8の場合、畫像データはカラーパレットの色番號が竝んでゐるものとなり、デコーダはその色番號が指し示すカラーパレットの色を認識する必要があります。また、1畫素當りのデータサイズが24,32の場合は、畫像データに直接色データが竝んでゐます。
畫像データは先程カラーパレットの項で述べたやうに、パレット或は直接色データ格納によつて表現されますが、32bitビットマップ以外のビットマップでは、4byte境界を意識する必要があります。
4byte境界とは、畫像の横ラインのデータは必ず4byteの境界に揃へなければならないといふ意味で、横1ラインのデータ長は必ず4で割り切れる數値でなければなりません。32bitビットマップの場合は、1畫素が4byteなので横ラインは必ず4で割り切れますから、意識する必要はありません。が、それ以外のビットマップでは意識する必要があります。
例へば、24bitビットマップで、畫像の幅が99ピクセルの場合を考へます。24bitビットマップでは、1畫素が3byteで表現されますから、横1ラインのデータ長は3*99=297で、之は4で割り切れる數値ではありません。其處で、この297バイトに、餘計な3バイトを追加して300バイトにすれば、4で割り切ることができます。その時追加する餘計なデータは0を指定します。