画像処理入門

~画像(Bitmap)の入出力~

―――――――――――――――――――――――――――――――――

画像処理のために最初にすること、画像の読み込みと書き込みについてです。

HOME | 次へ

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

 

BitmapWindowsが標準でサポートしている画像フォーマットです。

BitmapにはOS/2Windows用、また1ピクセル当たりのビット数(1,2,8,24)によって、

ヘッダー情報が異なります。

ここでは、Windows用の24bit Bitmapについて説明します。

 

ヘッダー情報の含まれていないRAW画像の方が読み込み、書き込みの観点では楽なのですが、

表示・保存できるソフトが少ないので、Bitmapを用いて画像処理を学んでいきます。

 

 

Bitmapフォーマットは大雑把に分けると次のように表すことができます。

①ファイルヘッダー (14 Byte) 

②情報ヘッダー (40 Byte)    

③画像データ (不定)         

 

     ファイルヘッダー

ファイルヘッダー部には14 byteのデータが格納されています。

最初のbfTypeBMであればビットマップであると判断します。

また、bfReaserved1bfReaserved2は常に0です。

typedef struct 

{

  char          bfType[2];      //2 byte -> BM

  int           bfSize;         //4 byte -> ファイルのサイズ

  short int     bfReserved1;    //2 byte -> 0

  short int     bfReserved2;    //2 byte -> 0

  int           bfOffBits;      //4 byte -> 画像データまでのオフセット

} BmpFileHeader;

 

 

     情報ヘッダー

情報ヘッダー部には40 byteのデータが格納されています。

画像の横(width)と縦(height)のサイズや、また1ピクセル当たりのビット数(biBitCount)が含まれます。

当然、今回使用するフォーマットではbiBitCounth24です。

typedef struct {

    int                         biSize;         //4 byte -> 情報ヘッダーのサイズ

    int                         biWidth;        //4 byte -> 画像の横幅

    int                         biHeight;       //4 byte -> 画像の縦幅

    short int               biPlanes;       //2 byte

    short int               biBitCount;     //2 byte -> 1 pixelのサイズ

    int                         biCompression//4 byte

    int                         biSizeImage;    //4 byte

    int                         biXPixPerMeter; //4 byte

    int                         biYPixPerMeter; //4 byte

    int                         biClrUsed;      //4 byte

    int                         biClrImporant//4 byte

} BmpInfoHeader;

 

 

     画像データ

画像データが1ピクセルごとにBlue(8 bit)Green(8 bit)Red(8 bit)の順番に格納されています。

(つまり1ピクセル当たり8 bit×3 = 24 bit

また、1行のサイズ(width×3 byte)が4 byteの倍数でなければならないので、

4の倍数にならない場合は0で埋められています。

例えば極端な例ですが、幅が2 pixelの画像ではwidth×3 byte = 6 byteですから、

4の倍数には2 byte足りません。そこで、以下のようにその2 byteを0で埋めます。

青、緑、赤、青、緑、赤、0、0

 

 

実際にビットマップのフォーマットを見てみましょう。

↑の画像(64*32)をバイナリエディタTSXBINを用いて読み込んでみた結果です。

画像データには画像の端、黄色の情報が映っていますが、

赤成分と緑成分の値が大きく青成分が0であることから、すなわち黄色を示していることがわかります。

 

 

C言語を使っての読み込み