カラーの画像をグレースケールに変換する式はいろいろあるようですが,一番かんたんなRとGとBを単純に足して割ることにします. Bitmapファイルを入出力してみるで RGB情報を取り出していますので,10行程追加すれば実装できます.
/*---------main.c------Read_BmpとWrite_Bmpの間に追加-----------*/ Grayscale(img);
/*---------bitmap.h----追加分---------------------------------*/ //グレースケールに変換 void Grayscale(Image *img);
/*---------bitmap.c----追加分---------------------------------*/ void Grayscale(Image *img) { int i, j; unsigned int index; unsigned char color; for(i=0; i<img->height; i++){ for(j=0; j<img->width; j++){ index = i*img->width + j; color = (img->data[index].r + img->data[index].g + img->data[index].b)/3; img->data[index].r = img->data[index].g = img->data[index].b = color; } } }
グレースケールはRGBの値が等しいのでRGBを平均したものを, RGBそれぞれに代入しています.ついでに面倒なのでMakefileも作っておきます.
bmp_samp: main.o bitmap.o gcc -o bmp_samp main.o bitmap.o main.o: main.c bitmap.h gcc -c main.c bitmap.o: bitmap.c bitmap.h gcc -c bitmap.c clean: rm bmp_samp *.o
これをMakefileという名前でソースコードと同じディレクトリにいれておけば,
$make
とするだけでbmp_sampという実行可能ファイルを作ってくれます.また,
$make clean
とすれば中間ファイル(***.o)と実行可能ファイルを消去します.
上記のたった数十行の追加だけですが,一応全ソースコードも置いておきます.