目次ページへ ビットマップファイル(*.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でも可 |
■カラーテーブル
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など)が表示可能となり、ビットフィールドが指定されます。 (ビットフィールドについては多ビット(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などは信じない方が良いと思います。
Loading...
スポンサーリンク
|