Bitmapfileフォーマット

ここでは、SampleGrabberのサンプルで出力に利用したビットマップファイルのフォーマットを説明したいと思います。

Bitmapファイルフォーマット概要

SampleGrabber説明用のサンプルで利用したビットマップファイルのフォーマットは非常に単純です。 Bitmapファイルは以下の図のようにBITMAPFILEHEADER、BITMAPINFOHEADER、RGBデータという順番に保存されています。

BITMAPFILEHEADER
BITMAPINFOHEADER
RGB data

BITMAPFILEHEADER

BITMAPFILEHEADERは以下の構造になっています。


typedef struct tagBITMAPFILEHEADER { 
  WORD    bfType; 
  DWORD   bfSize; 
  WORD    bfReserved1; 
  WORD    bfReserved2; 
  DWORD   bfOffBits; 
} BITMAPFILEHEADER;

bfType
ファイルの先頭に来る識別用情報です。 'B' + 'M'です。
bfSize
ファイル全体のサイズです。 SampleGrabberサンプルでは、sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + (画像幅×画像高さ×3)です。
bfReserved1, bfReserved2
利用されていません。
bfOffBits
ファイルの先頭からRGBデータが始まるまでのバイト数を表しています。 SampleGrabberサンプルでは、sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)です。

BITMAPINFOHEADER

BITMAPINFOHEADERは以下の構造になっています。


typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize; 
  LONG   biWidth; 
  LONG   biHeight; 
  WORD   biPlanes; 
  WORD   biBitCount; 
  DWORD  biCompression; 
  DWORD  biSizeImage; 
  LONG   biXPelsPerMeter; 
  LONG   biYPelsPerMeter; 
  DWORD  biClrUsed; 
  DWORD  biClrImportant; 
} BITMAPINFOHEADER;

biSize
構造体のサイズ
biWidth
画像の幅(ピクセル単位)
biHeight
画像の高さ(ピクセル単位)
biPlanes
プレーン数。1でなければならない。
biBitCount
bits-per-pixel
biCompression
圧縮方式。BI_RGB(無圧縮)、BI_RLE8、BI_RLE4(run length encoded、8bpp、4bpp)、BI_JPEG、BI_PNGなど
biSizeImage
イメージサイズ。BI_RGBの場合は0でも良い。
biXPelsPerMeter
pixel-per-meterでの幅
biYPelsPerMeter
pixel-per-meterでの高さ
biClrUsed
color indexで使われている数
biClrImportant
color indexを使って表示するために必要な色数

RGB data

RGB dataは以下の構造になっています。 本サイトで紹介しているdirectshowサンプル内では、MEDIASUBTYPE_RGB24(24ビットのRGB、8bit+8bit+8bit = 24bit)という指定でビットマップデータを取得しているためこのようになっていますが、一般的には24ビットRGB以外のBitmapもあるのでご注意下さい。


BYTE red;
BYTE green;
BYTE blue;

上記RGBデータがピクセルの個数だけ続きます。 例えば、画像サイズが720x480であった場合には720x480回RGBが続きます。 この場合、RGBデータサイズの総和は 720x480x3 = 1036800バイトになります。