画像を扱う構造体imageを用意しています。
/* 画像の構造体 */ typedef struct image { unsigned char *data; ← 各画素の値 int width; ←画像の幅 int height; ←画像の高さ int max_lvl; ←画素の最大値(基本的に255) int bytes; ←1ピクセルが何バイトで表されているか 1: グレイスケールの場合 3: RGBの場合 4: RGBαの場合 } image;
以下では構造体imageの使い方を説明します。
画像の作成方法は、新規画像の作成、画像の複製、 画像の読み込みの3種類があります。 一方、画像の開放は一種類のみです。
/* 宣言 */ struct image *img; /* 画像の作成(500x200のカラー画像を作る場合) */ img = create_img(500, 200, 3); /* 画像を初期化する(画素値を全部0にする) */ init_img(img); ... /* メモリの開放 */ freeImg(img);
500x200のグレースケール画像を作る場合はcreate_imgの3つ目の引数を1にします。
画像の初期化(init_img)は画素値を全部0にするだけなので、必ずしも実行する必要はありません。
/* 宣言 */ struct image *img; struct image *img_org; ... /* 画像の複製 */ img = copy_img(img_org); ... /* メモリの開放 */ freeImg(img); freeImg(img_org);
特に設定をしない場合はPNG形式の画像を扱います。下記の例はPNG形式の画像を読み込む場合です。
/* 宣言 */ struct image *img; /* 画像の読み込み(PNG画像の場合) */ img = pngRead("filename.png"); ... /* メモリの開放 */ freeImg(img);
PPM形式の画像を読み込む場合はpngReadの代わりにpnmReadを使います。
/* 宣言 */ struct image *img; /* 画像の読み込み(PPM画像の場合) */ img = pnmRead("filename.ppm"); ... /* メモリの開放 */ freeImg(img);
特に設定をしない場合はPNG形式の画像を扱います。下記の例はPNG形式の画像を書き込む場合です。
/* 宣言 */ struct image *img; ... /* 画像の書き込み(PNG画像の場合) */ pngWrite("filename.png", img); /* メモリの開放 */ freeImg(img);
PPM形式の画像を書き込む場合はpngWriteの代わりにpnmWriteを使います。
/* 宣言 */ struct image *img; ... /* 画像の書き込み(PPM画像の場合) */ pnmWrite("filename.ppm", img); /* メモリの開放 */ freeImg(img);
いずれの場合も、画像を保存してもメモリが開放されないことに注意してください。
画素値を扱う関数には画素値を得るものと変更するものの2種類あります。 それぞれに画像の範囲を確認するものとしないものの2種類あり、合計4つあります。以下、色cは、グレースケール画像の場合は常に0、RGB画像でRの場合は0、Gの場合は1、Bの場合は2とします。
int x, y, c; unsigned char val; ... /* 画像imgの(x,y)座標の色cの値を獲得する ((x,y)が画像の範囲外なら、エラーになるかもしれない) */ val = get_pix(img, x, y, c);
int x, y, c; unsigned char val; ... /* 画像imgの(x,y)座標の色cの値を獲得する ((x,y)が画像の範囲外なら、0を返す) */ val = get_pix_safe(img, x, y, c);
int x, y, c; unsigned char val; ... /* 画像imgの(x,y)座標の色cの値を val にする ((x,y)が画像の範囲外なら、エラーになるかもしれない) */ set_pix(img, x, y, c, val);
int x, y, c; unsigned char val; ... /* 画像imgの(x,y)座標の色cの値を val にする ((x,y)が画像の範囲外なら、何もしない) */ set_pix_safe(img, x, y, c, val);
画素値を扱う関数には画素値を得るものと変更するものの2種類あります。 それぞれに画像の範囲を確認するものとしないものの2種類あり、合計4つあります。以下、色cは、グレースケール画像の場合は常に0、RGB画像でRの場合は0、Gの場合は1、Bの場合は2とします。
int x, y, c; unsigned char val; ... /* 画像imgの(x,y,c)座標の色cの値を獲得する ((x,y)が画像の範囲外なら、エラーになるかもしれない) */ val = pix(img, x, y, c); ... /* 画像imgの(x,y)座標の色cの値を変更する ((x,y,c)が画像の範囲外なら、エラーになるかもしれない) */ pix(img, x, y, c) = val;
int x, y, c; unsigned char val; ... /* 画像imgの(x,y,c)座標の色cの値を獲得する ((x,y,c)が画像の範囲外なら、何もしない) */ val = pix_safe(img, x, y, c); ... /* 画素値の値を変更することはできない(次の操作はエラーになる) */ /* pix_safe(img, x, y, c) = val; */