[BMP]ビットマップのフォーマット
<09/01/17編集>
まず、ビットマップにはDIBとDDBというものがある。
違いは、デバイスに依存するかしないかという点。
DIB(Device Independent Bitmap)
→ デバイスに依存しないビットマップ
DDB(Device Dependent Bitmap)
→ デバイスに依存するビットマップ
ここで言うデバイスとは、ディスプレイなど、実際に表示したりするためのもので
あったりするが、この辺はデバイスコンテキスト とかとあわせて調べるべし。
個人的に理解しやすいイメージとしては、
DIBはファイルに保存されているバイナリ形式のもの。
つまり、バイナリデータを編集することで、色やサイズを直接編集できる。
DDBはDIBを元に、ディスプレイなどに表示されているビットマップ。
または、表示のためだけに作成されたビットマップ。
(この辺の解釈はあくまでイメージなので、実際の定義とは違うと思います。)
DIBはカラーテーブルをもち、次のような構造をもつ。
BITMAPFILEHEADER
BITMAPINFOHEADER
カラーテーブル
カラーテーブルは24bit未満のビットマップに対して設定される。
BITMAPINFOHEADERとカラーテーブルをもった構造体をBITMAPINFO構造体と
言うが、自分が扱うのは24bit以上のビットマップのため、カラーテーブルは特に
考慮していない。
24bit以上の場合、色データは直接バイト列として扱われるため、
次のような感じ。
24bitビットマップ
→24bit(3byte)で1ピクセルを表現する。各バイトにはRGBカラーをそれぞれもつ。
ダンプしたときはBGRの順で並んでいる。
参照:RGBTRIPLE構造体
32bitビットマップ
→32bit(4byte)で1ピクセルを表現する。上記24bitと同様だが、ひとつは
予約領域として使われていない。
参照:RGBQUAD構造体
BITMAPFILEHEADER構造体
次の構成を持つ構造体。
typedef struct tagBITMAPFILEHEADER {
WORD bfTyep; // ファイルタイプ(BM(0x424D)でなければならない)
DWORD bfSize; // ファイルのサイズ
WORD bfReserved1; // 予約領域(0)
WORD bfReserved2; // 予約領域(0)
DWORD bfOffbits; // ファイル先頭から、ビットマップデータまでのバイト数
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;
BITMAPINFOHEADER構造体
次の構成を持つ構造体。
typedef struct tagBITMAPINFOHEADER {
DWORD biSize; // 構造体のバイト数
LONG biWidth; // ビットマップのピクセル幅
LONG biHeight; // ビットマップのピクセル高さ
WORD biPlanes; // 対象デバイスに対するプレーン数(1)用途よくわからん
WORD biBitCount; // 1ピクセル当たりのビット数
DWORD biCompression; // 圧縮タイプ
DWORD biSizeImage; // イメージ部分のサイズ
LONG biXPelsPerMeter; // よくわからん(ビットマップに対する対象デバイスの水平解像度)
LONG biYPersPerMeter; // よくわからん(ビットマップに対する対象デバイスのつい直解像度)
DWORD biClrUsed; // 使用される色の数
DWORD biClrImportant; // 重要な色
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
RGBTRIPLE構造体
typedef struct tagRGBTRIPLE {
BYTE rgbBlue; // 青
BYTE rgbGreen; // 緑
BYTE rgbRed; // 赤
}
RGBQUAD構造体
typedef struct tagRGBQUAD {
BYTE rgbBlue; // 青
BYTE rgbGreen; // 緑
BYTE rgbRed; // 赤
BYTE rgbReserved; // 予約領域
}
面倒なのが、24bitタイプのビットマップである。
ラスタ列(ビットマップの横ライン)は4byteアライメントされていないといけない。
例えばピクセル幅101のビットマップは、バイトに直すと
101 * 3 = 303
となり、303 % 4 = 3 のため、4バイト境界調整を行わなければならない。
この場合は3バイト足りない(当然データを減らすことはないので、*バイト多いということはない)
なので、3バイト分追加し、102ピクセル幅として扱う必要が出てくる。
これらを考慮したビットマップの作成、表示をやってみようと思う。
MFCではなく、WIN32APIを使用して行うタイプ。
MFC使用版はもっと簡単だけど、WIN32API版はより高速らしい(そりゃそうだ)
- 詳解 画像処理プログラミング C言語で実装する画像処理アルゴリズムのすべて/昌達 慶仁
- ¥3,990
- Amazon.co.jp