C言語でカラー画像を取り込んでグレースケール画像で出力したいのですが、
プログラム自体はエラーはないのですが、
実行すると、
$ ./sample Lenna.ppm sample1.pgm [Lenna.ppm] is not a ppm-file!
となってしまいます。
検索しても原因がわかりません。
これは、何が原因なのでしょうか?
Macのターミナルでやっています。
プログラムはこのようにしてやっています。
#include <stdio.h> #include <stdlib.h> #include <math.h> unsigned char *read_ppm(char *fname, int *width, int *height); void save_pgm(char *fanme, unsigned char *gray, int width, int height); int main(int argc, char* argv[]) { int width, height; /*入力画像サイズ*/ unsigned char *src, *out; /*白黒画像:それぞれ入力用と出力用に対応*/ int f; /*入力の画素値*/ int g[256] = {0};/*出力の画素値*/ int f_L = 0,f_H = 75; /*カラー画像ファイルを白黒化して読み込み*/ src = read_ppm(argv[1], &width, &height); /*出力画像の保存*/ save_pgm(argv[2], src, width, height); free(src); return 0; } unsigned char *read_ppm(char *fname, int *width, int *height) { char str[256], c; int max=0; unsigned char *gray = NULL; int r=0,g=0,b=0; int size=0; int i; FILE *fp=fopen(fname,"rb"); if(fp==NULL){ fprintf(stderr, "error: %s cannot open!\n",fname); exit(-1); } /*-----------------Magic number------------*/ fscanf(fp, "%s", str); c = str[1]; if(c=='3'||c=='6'){ /*-------------comment, space, or size ------------*/ fscanf(fp, "%s", str); if(str[0]=='#'||str[0]==' '){ while(fscanf(fp,"%c",&str[0])){/* comment skip*/ if(str[0]=='\n') break; } fscanf(fp, "%d %d",width,height); } else{ scanf(str,"%d",width); fscanf(fp, "%d",height); } /* ------------ comment, space, or max value ---------- */ fscanf(fp, "%d", &max); /* ------------ memory create ---------- */ size = (*width) * (*height); gray = (unsigned char *)malloc(size); /* ------------ pixel value ---------- */ if(c == '3'){ /* テキストデータ */ for(i = 0; i < size; i++){ fscanf(fp, "%d %d %d", &r, &g, &b); gray[i] = (unsigned char)(0.299 * r + 0.587 * g + 0.114 * b + 0.5); } } else{ /* バイナリデータ */ fread(&r,1,1,fp); /* LF */ for(i = 0; i < size; i++){ fread(&r,1,1,fp); fread(&g,1,1,fp); fread(&b,1,1,fp); gray[i] = (unsigned char)(0.299 * r + 0.587 * g + 0.114 * b + 0.5); } } } else fprintf(stderr, "[%s] is not a ppm-file!\n", fname); fclose(fp); return gray; } void save_pgm(char *fname, unsigned char *gray, int width, int height) { int x, y; FILE *fp = fopen(fname, "w"); fprintf(fp, "P2\n"); fprintf(fp, "%d %d\n", width, height); fprintf(fp, "255\n"); for(y = 0; y < height; y++){ for(x = 0; x < width; x++) fprintf(fp, "%d ", gray[width * y + x]); /* (注) %d の後にスペースあり */ fprintf(fp, "\n"); } fclose(fp); return; }
追記
皆様のコメントのおかげで出来ました。
ありがとうございます。
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![退会済みユーザー](https://ddjkaamml8q8x.cloudfront.net/profileImages/deletedUser/icnUserSample.jpeg)
![guest](/img/icon/icnUserSample.jpg)
回答2件
あなたの回答
tips
プレビュー