[BMP]ビットマップのフォーマット | Assertion Failed!

[BMP]ビットマップのフォーマット

<09/01/17編集>


まず、ビットマップにはDIBDDBというものがある。

違いは、デバイスに依存するかしないかという点。


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