画像処理プログラミング

ビットマップファイルフォーマット

スポンサーリンク

ビットマップファイル(*.bmp)のファイルフォーマットです。

 

ビットマップ全体の構造

BITMAPFILEHEADER14Byte
BITMAPINFOHEADER40Byte
カラーテーブル(無い場合もあり)4Byte*Index数
画像データ

 

各構造体について

■BITMAPFILEHEADER

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

 

bfTypeファイルタイプ‘BM’
bfSizeファイル全体のサイズ(バイト数)
bfReserved1予約領域常に0
bfReserved2予約領域常に0
bfOffBitsファイル先頭から画像データまでのオフセット数(バイト単位)

 

■BITMAPINFO

typedef struct tagBITMAPINFO {
	BITMAPINFOHEADER  bmiHeader;
	RGBQUAD                   bmiColors[1];
} BITMAPINFO, *PBITMAPINFO;

 

●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, *PBITMAPINFOHEADER;

 

biSize構造体のサイズ40
biWidth画像の幅(ピクセル数)
biHeight画像の高さ(ピクセル数)
値が負の場合、画像の上下が逆になる
biPlanesプレーン数常に1
biBitCount1画素あたりのビット数1,4,8,16,24,32
biCompression圧縮形式BI_RGB, BI_RLE8, BI_RLE4
BI_BITFIELDS, BI_JPEG, BI_PNG
biSizeImage画像データのサイズ(バイト数)BI_RGBの場合0でも可
biXPelsPerMeter水平方向の1Mあたりの画素数0でも可
biYPelsPerMeter垂直方向の1Mあたりの画素数0でも可
biClrUsedカラーテーブルの色数0でも可
biClrImportant表示に必要なカラーテーブルの色数0でも可

 

●RGBQUAD(カラーテーブル)

typedef struct tagRGBQUAD {
	BYTE    rgbBlue;
	BYTE    rgbGreen;
	BYTE    rgbRed;
	BYTE    rgbReserved;
} RGBQUAD;

 

rgbBlue青の輝度値0~255
rgbGreen緑の輝度値0~255
rgbRed赤の輝度値0~255
rgbReserved予約領域常に0

 

biBitCountが1,4,8のとき、RGBQUAD構造体のカラーテーブルが指定されます。
biBitCountが24,32のときは存在しません。
ただし、biCompressionがBI_BITFIELDS かつ、biBitCountが16,32の場合、
多ビット(10Bit,12Bitなど)が表示可能となり、ビットフィールドが指定されます。

 

■画像データ

モノクロ画像の場合、輝度値が格納されています。

24Bitカラーの場合、B,G,R,B,G,R・・・の順で各輝度値が格納されています。
32Bitカラーの場合、B,G,R,A,B,G,R,A・・・の順で各輝度値が格納されています。

 

画像データは、画像の左から右、下から上へ向かう順番で格納されます。

 

画像データ

 

また、1行あたりのメモリのサイズは4の倍数バイトになるように調整されています。
この値は以下のようにして計算しています。

 

VBの場合

((biWidth * biBitCount + 31) \ 32) * 4

Cの場合

((biWidth * biBitCount + 31) / 32) * 4

 

4の倍数バイト(32ビットの倍数)になるように調整しています。

 

ビットマップファイルを開く場合の注意点について

ビットマップファイルを開く場合、ヘッダ情報をもとに画像データ格納用のメモリを確保し、
そのメモリにデータを格納しますが、ヘッダの値はすべて正しく記載されているとは限りません。私の場合、以下の値を信じてメモリの確保などを行っています。

biWidth, biHeight, biBitCountを用いて画像データ格納用メモリの確保
biOffBitsを用いて、画像データまでのファイルのシークを行う。

biSizebiSizeImageなどは信じない方が良いと思います。

 

コメント

タイトルとURLをコピーしました