ピクセルデータに直接アクセス
OpenCVを使ってみます。OpenCVはインテルが公開しているライブラリのことです。
とりあえずopencv.jpのサンプルコードを参考にしてコードを書いてみました。
#include <cv.h> #include <highgui.h> int main (int argc, char **argv) { int x, y; unsigned char p[3]; IplImage *img; if (argc != 2 || (img = cvLoadImage (argv[1], CV_LOAD_IMAGE_COLOR)) == 0) return -1; // ピクセルデータの取得(BGR) // widthStep = アライメントした横のバイトサイズ for (y = 0; y < img->height; y++) { for (x = 0; x < img->width; x++) { p[0] = img->imageData[img->widthStep * y + x * 3]; // B p[1] = img->imageData[img->widthStep * y + x * 3 + 1]; // G p[2] = img->imageData[img->widthStep * y + x * 3 + 2]; // R img->imageData[img->widthStep * y + x * 3] = cvRound((p[0] + p[1] + p[2]) / 3); img->imageData[img->widthStep * y + x * 3 + 1] = cvRound((p[0] + p[1] + p[2]) / 3); img->imageData[img->widthStep * y + x * 3 + 2] = cvRound((p[0] + p[1] + p[2]) / 3); } } cvNamedWindow ("Image", CV_WINDOW_AUTOSIZE); cvShowImage ("Image", img); cvWaitKey (0); cvDestroyWindow ("Image"); cvSaveImage("gray.jpg",img); cvReleaseImage (&img); return 0; }