ビットマップファイルは、畫像の形式の一つで、無壓縮のものです。無壓縮なので當然ファイルサイズは大きくなります。ビットマップファイルの中身は、點毎の色データ(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を指定します。