RIGHT:寄稿:東條遼平 * RGB情報の平均をとる [#yd7b3b60] カラーの画像をグレースケールに変換する式はいろいろあるようですが、一番かんたんな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)と実行可能ファイルを消去します。 上記のたった数十行の追加だけですが、一応全ソースコードも置いておきます。 - &ref(main.c); - &ref(bitmap.c); - &ref(bitmap.h);