公開日
2007-08-03
公開元
灰塵

PC小噺1 - Windowsビットマップファイル

ビットマップファイルとは何ぞや

ビットマップファイルは、畫像の形式の一つで、無壓縮のものです。無壓縮なので當然ファイルサイズは大きくなります。ビットマップファイルの中身は、點毎の色データ(RGB形式かパレット形式かはファイルに依存する)の集合です。

フォーマット

全體構造

ファイルヘッダ(14byte)

最初に、OS/2、Windowsビットマップを問はないファイルヘッダがあり、サイズは14byteで固定です。

データの意味占有バイト數内容
ファイルタイプ2byte"BM"(ビットマップファイル識別子)
ファイルサイズ(單位:byte)4byteファイルに依る
豫約領域12byte常に0
豫約領域22byte常に0
ファイル先頭から畫像データまでのオフセット(單位:byte)4byteファイルに依る

各データの詳細な意味

ファイルタイプ
一バイト目が'B'、二バイト目が'M'ならば、ビットマップファイルである事が認識される。(詰り、ビットマップファイルの識別子)
ファイルサイズ
そのビットマップファイルの、畫像部分とヘッダ部分を全て合はせたファイルのサイズ。
豫約領域1,2
現在は使はれてをらず、常に0が格納されてゐる。將來は何に使はれるか分らない。
ファイル先頭から畫像データまでのオフセット
畫像データが開始する位置。ヘッダ全體のサイズと捉へる事も出來る。

Cで構造體にしてみた

struct {
    unsigned short FileType;
    unsigned long  FileSize;
    unsigned short Reserved1, Reserved2;
    unsigned long  Offset;
};

情報ヘッダ

次に示す情報ヘッダはWindowsのbmp形式のファイル特有のもので、OS/2のものには存在しません。

データの意味占有バイト數内容
情報ヘッダのサイズ(單位:byte)4byte40
畫像の幅(單位:pixel)4byte畫像に依る
畫像の高さ(單位:pixel)4byte畫像に依る
プレーン數2byte常に1
1畫素當りのデータサイズ(單位:bit)2byte1,4,8,16,24,32のうちどれか(0の場合もある)
壓縮形式4byte0,1,2,3のうちどれか
畫像データ部のサイズ(單位:byte)4byte畫像データのサイズ
横方向解像度4byte96dpiならば3780か0かどちらか
縱方向解像度4byte96dpiならば3780か0かどちらか
格納されてゐるパレット數(使用色數)4byteパレットを使ふならば、其の使用色數、使はないなら0
重要なパレットのインデックス4byte0の場合もある

各データの詳細な意味

情報ヘッダのサイズ
このヘッダそのもののサイズが記録されてゐます。内容は固定で40です。
畫像の幅
ファイルに格納されてゐる畫像の幅です。
畫像の高さ
ファイルに格納されてゐる畫像の高さを絶對値で表してゐます。正數ならば、畫像データは下から上に向かつて、負數ならば畫像データは上から下に向かつて記録されてゐます。
プレーン數
畫像のプレーン數(チャンネル數)が格納されてゐます。内容は固定で1です。
1畫素當りのデータサイズ
1畫素を何bitで表すかが格納されてゐます。内容は1,4,8,16,24,32のうちどれかです。(0の場合もある)此の値は次に示す壓縮形式に影響を與へます。
1
2色ビットマップ
4
16色ビットマップ
8
256色ビットマップ
16
65536色ビットマップ(大抵のデコーダは正式に對應してゐない)
24
1677萬7216色のビットマップ
32
1677萬7216色のビットマップ(畫素毎に1バイトのリザーブがある)
壓縮形式
畫像の壓縮方法が格納されてゐます。
0
無壓縮。此の場合、1畫素當りのデータサイズが0以外でなければなりません。
1
8bitのランレングス壓縮。此の場合、1畫素當りのデータサイズが8でなければなりません。
2
4bitのランレングス壓縮。此の場合、1畫素當りのデータサイズが4でなければなりません。
3
ビットフィールドを持つ無壓縮。此の場合、1畫素當りのデータサイズが16若しくは32でなければなりません。
4
JPEG形式。此の場合、1畫素當りのデータサイズは0でなければなりません。
5
PNG形式。此の場合、1畫素當りのデータサイズは0でなければなりません。
畫像データ部のサイズ
畫像データのサイズが格納されてゐます。壓縮形式が0か3である場合、此の値は0の可能性があります。
横方向解像度
畫像の横方向の1メートル當りのピクセル數が格納されてゐます。0の場合もあります。
縱方向解像度
畫像の縱方向の1メートル當りのピクセル數が格納されてゐます。0の場合もあります。
格納されてゐるパレット數
カラーパレットに格納される色數が格納されてゐます。此の値が0にも拘らず、1畫素當りのデータサイズが8以下(パレットを必要とする)場合、色數は2を1畫素當りのデータサイズの値で累乘した數になります。
重要なパレットのインデックス
カラーパレットに格納されてゐる色のうち、正確に表示すべき重要色の數が格納されてゐる。此の値が0の場合、全ての色が重要色とされる。

Cで構造體にしてみた

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以下の場合に存在します。

RGBの表し方

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畫素1bit
モノクロ畫像ですが、實は白黒以外も選擇可能で、赤青ビットマップなどにすることも出來るため、カラーパレットが必要です。2色なのでカラーパレットは2つ(8byte)必要です。
1畫素4bit
16色ビットマップなので、16個(64byte)のカラーパレットが必要です。
1畫素8bit
256色ビットマップなので、256個(1024byte)のカラーパレットが必要です。
1畫素24bit
カラーパレットはありません。
1畫素32bit
カラーパレットはありません。

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を指定します。