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バイトになります。