BMPファイルフォーマット(Windows拡張)

作成:

前回は OS/2 ビットマップのヘッダについて説明した。 今回は Windows ビットマップの拡張ヘッダについて説明する。 一般に Windows ビットマップと呼ばれる場合の BITMAPINFOHEADER は Windows3.0 時代に定義されたヘッダである。 その後 Windows のバージョンアップとともに拡張されたヘッダが定義されている。 画像ファイルとして利用する場合は BITMAPINFOHEADER で十分であるため、 この形式をサポートしているアプリケーションは少ないが一応紹介しておく。

情報ヘッダ(BITMAPV4HEADER)

Windows95 以降で利用可能なヘッダである。

typedef struct {
  DWORD        bV4Size;
  LONG         bV4Width;
  LONG         bV4Height;
  WORD         bV4Planes;
  WORD         bV4BitCount;
  DWORD        bV4V4Compression;
  DWORD        bV4SizeImage;
  LONG         bV4XPelsPerMeter;
  LONG         bV4YPelsPerMeter;
  DWORD        bV4ClrUsed;
  DWORD        bV4ClrImportant;
  DWORD        bV4RedMask;
  DWORD        bV4GreenMask;
  DWORD        bV4BlueMask;
  DWORD        bV4AlphaMask;
  DWORD        bV4CSType;
  CIEXYZTRIPLE bV4Endpoints;
  DWORD        bV4GammaRed;
  DWORD        bV4GammaGreen;
  DWORD        bV4GammaBlue;
} BITMAPV4HEADER, *PBITMAPV4HEADER;

MSDNでは BITMAPV4HEADER structure に説明がある。

BITMAPINFOHEADER の純粋な拡張で、メンバ名に V4 が入っている点を除けば、 bV4ClrImportant まではビット幅や符号の有無、意味付けなどは同一である。 そのため、拡張された範囲についてのみ説明する。

概要としては、カラーマスクをヘッダ内に取り込み、色空間情報が追加されている。 構造体のサイズとしては 108Byte ある。すなわち、 bV4Size の値は 108 である。

bV4RedMask
bV4GreenMask
bV4BlueMask
bV4AlphaMask
BITMAPINFOHEADER では定義されておらず、 拡張情報としてカラーパレット領域に配置されていたカラーマスクがヘッダ内に定義されている。 そして、 RGB の次にアルファチャンネルが定義されている。 すなわち、このヘッダ以降の BMP ではアルファチャンネルを扱うことができる。 データ構造として、ヘッダを BITMAPINFOHEADER として無理やり解釈しても アルファチャンネルのサポートを除けば正常に読み込み可能な配置になっている。 読み込みの方法はカラーパレットで説明したものと同一となる。 bV4BitCount が 32 であった場合でも、 bV4Compression が BI_RGB の場合は、 このパラメータは利用されず、 BGR と 8bit ずつ格納された後、最後の 8bit は利用されない。 すなわちアルファチャンネルは格納されない。
bV4CSType
色空間のタイプを指定する。指定できる値として LogicalColorSpace LogicalColorSpaceV5 という enum 値が定義されている。 実際の値は文字列のバイナリ値である。 ただし、ファイルヘッダの先頭にあるマジックナンバーである"BM"とは異なり、 DWORD の MSB を先頭とした4文字で表現される。 例えば、 sRGB を表す値は 0x73524742 であるが、リトルエンディアンで出力されるので、 バイナリの順番としては"BGRs"と逆さまになっている。
LCS_CALIBRATED_RGB = 0
これ以降のフィールドで定義する独自色空間の場合に指定。
LCS_sRGB = 0x73524742
sRGBの色空間が適用されていることを示す。値は "sRGB" の文字列である。
LCS_WINDOWS_COLOR_SPACE = 0x57696E20
Windows デフォルトの色空間が適用されていることを示す。値は "Win " の文字列である。 Winでは文字数が足りないので最後にスペース(SP=0x20)が入っている。
以降の色空間パラメータは、このフィールドが LCS_CALIBRATED_RGB の時のみ有効で、これ以外の時は無視される。 MSDNの BITMAPV4HEADER の説明では LCS_CALIBRATED_RGB の値しか取らないように書かれているが、 別の資料によればこの3つの値を取りうるとのことである。
bV4Endpoints
色空間を表現するパラメータで、 RGB それぞれのエンドポイントを CIE XYZ 色空間で表現した場合の値を格納する。 前述のとおり、 bV4CSType の値が LCS_CALIBRATED_RGB のときのみ有効となる。 型である CIEXYZTRIPLE
typedef struct tagCIEXYZTRIPLE {
  CIEXYZ ciexyzRed;
  CIEXYZ ciexyzGreen;
  CIEXYZ ciexyzBlue;
} CIEXYZTRIPLE typedef CIEXYZTRIPLE FAR* LPCIEXYZTRIPLE;
という構造体で、さらにこの構造体の各メンバーの型である CIEXYZ
typedef struct tagCIEXYZ {
  FXPT2DOT30 ciexyzX;
  FXPT2DOT30 ciexyzY;
  FXPT2DOT30 ciexyzZ;
} CIEXYZ, CIEXYZ FAR* LPCIEXYZ;
という構造体となっている。 FXPT2DOT30 という型は、なんとなく名前から想像できると思うが、 符号なし 32bit 固定小数点数であり、整数部 2bit 、小数部 30bit で解釈する。 値の意味としては、この画像で使用している RGB 色空間を CIE XYZ 色空間にマップする際に使用される値なのだが、 CIE XYZ 色空間ってなんぞやという話になってくると、 プログラミングそのものとはまた別の画像処理等の知識が必要になってくるため、割愛。 色空間の変換や直接画像デバイスを駆動するドライバ等でなければ使用することのないパラメータだし、 私自身きちんと説明しきる自信がない。
bV4GammaRed
bV4GammaGreen
bV4GammaBlue
色空間を表現するため、 RGB それぞれのガンマ値を格納する。 前述のとおり、 bV4CSType の値が LCS_CALIBRATED_RGB のときのみ有効となる。 型は DWORD だが、整数部 16bit 、小数部 16bit の符号なし 32bit 固定小数点数として解釈する。 このあたりの説明は LOGCOLORSPACE structure を参考。

通常扱うことはないと思うが、上記の説明で出てきた固定小数点数だが、 2進数の小数表現を勉強していないとどのように解釈すべきなのか理解できないと思うし、 固定小数のままでは計算に利用するのは難しいため、浮動小数点数に変換する方法を簡単に説明する。 ガンマに使われる 16.16 の符号なし固定小数点数の場合、 まずは符号なし整数値として解釈した後、浮動小数点型にキャスト、0x10000(=2^16)で割ればよい。 浮動小数点型は符号ビットと指数部が必要なため、 当然、同じ 32bit 幅の float に変換した場合は、固定小数点数表現より精度が下がるので注意。

情報ヘッダ(BITMAPV5HEADER)

Windows2000 以降で利用可能なヘッダである。

typedef struct {
  DWORD        bV5Size;
  LONG         bV5Width;
  LONG         bV5Height;
  WORD         bV5Planes;
  WORD         bV5BitCount;
  DWORD        bV5Compression;
  DWORD        bV5SizeImage;
  LONG         bV5XPelsPerMeter;
  LONG         bV5YPelsPerMeter;
  DWORD        bV5ClrUsed;
  DWORD        bV5ClrImportant;
  DWORD        bV5RedMask;
  DWORD        bV5GreenMask;
  DWORD        bV5BlueMask;
  DWORD        bV5AlphaMask;
  DWORD        bV5CSType;
  CIEXYZTRIPLE bV5Endpoints;
  DWORD        bV5GammaRed;
  DWORD        bV5GammaGreen;
  DWORD        bV5GammaBlue;
  DWORD        bV5Intent;
  DWORD        bV5ProfileData;
  DWORD        bV5ProfileSize;
  DWORD        bV5Reserved;
} BITMAPV5HEADER, *PBITMAPV5HEADER;

MSDNでは BITMAPV5HEADER structure に説明がある。

BITMAPV4HEADER の純粋な拡張で、メンバ名は異なるが、 bV5GammaBlue まではビット幅や符号の有無、意味付けなどは基本同一である。 bV5CSType については定義が追加されているため、この部分については追加で説明する。

概要としては、カラーマネージメント情報が追加されている。 構造体のサイズとしては 124Byte ある。すなわち、 bV5Size の値は 124 である。

bV5CSType

色空間のタイプを指定する。指定できる値として BITMAPV4HEADER で指定されていた、 LogicalColorSpace に加えて、 LogicalColorSpaceV5 を指定できる。

LogicalColorSpace
LCS_CALIBRATED_RGB = 0
これ以降のフィールドで定義する独自色空間の場合に指定。
LCS_sRGB = 0x73524742
sRGBの色空間が適用されていることを示す。値は"sRGB"の文字列である。
LCS_WINDOWS_COLOR_SPACE = 0x57696E20
Windowsデフォルトの色空間が適用されていることを示す。値は"Win "の文字列である。 Winでは文字数が足りないので最後にスペース(SP=0x20)が入っている。
LogicalColorSpaceV5
PROFILE_LINKED = 0x4C494E4B
他のファイルにあるカラープロファイルを利用することを示す。 値は"LINK"の文字列である。
PROFILE_EMBEDDED = 0x4D424544
カラープロファイル情報がこのファイル内に埋め込まれていることを示す。 値は"MBED"の文字列である。

BITMAPV4HEADER から2つの定義が追加されているが、 Endpoints と Gamma については LCS_CALIBRATED_RGB の時のみ有効な値として作用する。

bV5Intent
カラーマネージメントモジュールのレンダリングインテント(描画意図)を示す。以下の様な値が定義されている。
描画意図ICC名
LCS_GM_BUSINESS(1)GraphicSaturation(彩度)
LCS_GM_GRAPHICS(2)ProofRelative Colorimetric(相対的カラーメトリック)
LCS_GM_IMAGES(4)PicturePerceptual(知覚)
LCS_GM_ABS_COLORIMETRIC(8)MatchAbsolute Colorimetric(絶対的カラーメトリック)
bV5ProfileData
bV5ProfileSize
カラープロファイルのデータの配置場所とサイズを示す。 bV5CSType が PROFILE_LINKED もしくは PROFILE_EMBEDDED の時のみ有効で、それ以外の時無視される。 位置は BITMAPV5HEADER の先頭からのオフセットバイト数で表現される。 格納されているデータは PROFILE_LINKED の場合、null 終端されたファイル名である。 ファイル名の文字コードは CP1252 で記述される。 PROFILE_EMBEDDED の場合は、埋め込まれたプロファイルデータそのものである。
bV5Reserved
予約領域、必ず0を格納する。

以上で、Windows拡張のBMPヘッダについて説明した。 アルファチャンネルへの対応を除けば色空間などの詳細なカラーマネージメントに利用されるパラメータが格納されており、 単純な画像処理等ではあまり利用しないパラメータが多々ある。 すでに説明している、画像情報の格納構造体ではこれらデータを利用できるようには作っていないため、 基本これらの拡張パラメータは無視するように作っている。