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)が入っている。
- bV4Endpoints
-
色空間を表現するパラメータで、 RGB それぞれのエンドポイントを CIE XYZ 色空間で表現した場合の値を格納する。
前述のとおり、 bV4CSType の値が LCS_CALIBRATED_RGB のときのみ有効となる。
型である
CIEXYZTRIPLE
は
typedef struct tagCIEXYZTRIPLE { CIEXYZ ciexyzRed; CIEXYZ ciexyzGreen; CIEXYZ ciexyzBlue; } CIEXYZTRIPLE typedef CIEXYZTRIPLE FAR* LPCIEXYZTRIPLE;
typedef struct tagCIEXYZ { FXPT2DOT30 ciexyzX; FXPT2DOT30 ciexyzY; FXPT2DOT30 ciexyzZ; } CIEXYZ, CIEXYZ FAR* LPCIEXYZ;
- 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)が入っている。
- PROFILE_LINKED = 0x4C494E4B
- 他のファイルにあるカラープロファイルを利用することを示す。 値は"LINK"の文字列である。
- PROFILE_EMBEDDED = 0x4D424544
- カラープロファイル情報がこのファイル内に埋め込まれていることを示す。 値は"MBED"の文字列である。
BITMAPV4HEADER から2つの定義が追加されているが、 Endpoints と Gamma については LCS_CALIBRATED_RGB の時のみ有効な値として作用する。
- bV5Intent
- カラーマネージメントモジュールのレンダリングインテント(描画意図)を示す。以下の様な値が定義されている。
値 描画意図 ICC名 LCS_GM_BUSINESS(1) Graphic Saturation(彩度) LCS_GM_GRAPHICS(2) Proof Relative Colorimetric(相対的カラーメトリック) LCS_GM_IMAGES(4) Picture Perceptual(知覚) LCS_GM_ABS_COLORIMETRIC(8) Match Absolute Colorimetric(絶対的カラーメトリック) - bV5ProfileData
- bV5ProfileSize
- カラープロファイルのデータの配置場所とサイズを示す。 bV5CSType が PROFILE_LINKED もしくは PROFILE_EMBEDDED の時のみ有効で、それ以外の時無視される。 位置は BITMAPV5HEADER の先頭からのオフセットバイト数で表現される。 格納されているデータは PROFILE_LINKED の場合、null 終端されたファイル名である。 ファイル名の文字コードは CP1252 で記述される。 PROFILE_EMBEDDED の場合は、埋め込まれたプロファイルデータそのものである。
- bV5Reserved
- 予約領域、必ず0を格納する。
以上で、Windows拡張のBMPヘッダについて説明した。 アルファチャンネルへの対応を除けば色空間などの詳細なカラーマネージメントに利用されるパラメータが格納されており、 単純な画像処理等ではあまり利用しないパラメータが多々ある。 すでに説明している、画像情報の格納構造体ではこれらデータを利用できるようには作っていないため、 基本これらの拡張パラメータは無視するように作っている。