画像処理プログラミング

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

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

 

ビットマップ全体の構造

BITMAPFILEHEADER 14Byte
BITMAPINFOHEADER 40Byte
カラーテーブル(無い場合もあり) 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
biBitCount 1画素あたりのビット数 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を用いて、画像データまでのファイルのシークを行う。

biSizeやbiSizeImageなどは信じない方が良いと思います。

 

コメント

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