質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Q&A

解決済

2回答

1248閲覧

C言語で2値化ができません

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

0グッド

0クリップ

投稿2021/04/04 13:45

編集2021/04/06 01:59

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; }

追記
皆様のコメントのおかげで出来ました。
ありがとうございます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yumetodo

2021/04/04 13:45

プログラムを追記してください
退会済みユーザー

退会済みユーザー

2021/04/04 13:50

返信ありがとうございます。 追記しました。
yumetodo

2021/04/04 14:49

当該画像データをテキストエディタで開いたとき、先頭2文字はP3かP6になっていますか?
退会済みユーザー

退会済みユーザー

2021/04/04 15:10

BM6^@^A^@^@^@^@^@6^@^@^@(^@^@^@^@^A^@^@^@^A^@^@^A^@^X^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@^@9^VR> `A^^a>^Z\D$b:^UYK^[_W8y<80><81>·ª¼Ú¯½Û´½Ý®ÁܨºÙ<91>°Ò}<94>Â[Q<9d>X\¸ZiÔs^?ào<8d>åv<8f>é<80><97>ì|£ë<81>¡î|<9f>í~¢ì<84>¢ð<82><9b>ív<9e>åbd¾gE<8e>L/mC^Zd9^Va8^MR8^MSH^_]T0l9 @ ってなっています。
KoichiSugiyama

2021/04/04 15:19 編集

ファイルタイプが"BM"なのでビットマップファイルってことですね。プログラムが期待している"P3"または”P6"になっていないため、ppmファイルではない、とメッセージが出ています。ppmファイルについては詳しくないのですが、サンプルのデータが違っているのではないでしょうか。
退会済みユーザー

退会済みユーザー

2021/04/04 15:26

そうですね、元は.bmpの画像を.ppmにして使っているのでそうなったのかもしれません。 どうしたらいいのでしょうか?
KoichiSugiyama

2021/04/04 15:32

ウェブ検索で「bmp ppm 変換」で検索すると、かなりの数のサイトがヒットしますが、オンラインでファイル変換してくれるサイトもありました。「元は.bmpの画像を.ppmにして使っているので」とありますが、そういったサイトを使用して変換されたのでしょうか?
dodox86

2021/04/05 00:13

> 元は.bmpの画像を.ppmにして使っている まさかとは思うのですが、拡張子 .bmpを .ppmに変換(ファイル名リネーム)ではないですよね。
退会済みユーザー

退会済みユーザー

2021/04/05 03:08 編集

おっしゃる通りです... 実際にサイトでppmに変換して実行したのですが、エラーはなくなったのですが、処理が終わりません。 追記 すみませんでした。 #Created by IrfanView を入れたら出来ました。
yumetodo

2021/04/05 23:56

そろそろ整理してほしい、結局どうなって何が解決してないのか質問文に追記してください
dodox86

2021/04/06 02:36

質問文における[2021/04/06 10:59]の編集を読んで: @質問者ourinさん yumetodoさんが指摘してくださったことが伝わっていないと思うのでコメントしますが、何が原因で動かなかったのか、具体的にどこをどう操作し、修正したら動くようになったのか、この質問を読んだ者には分かりません。(コメントをした一人の私も分かりません) > #Created by IrfanView > を入れたら出来ました。 とありますが、どこで何に対して入れたのか、そもそも"# Created ..."が何やら分かりません。本欄での指摘も、早いうちからの回答もいただいていたのですからちゃんと対応しましょう。もし、いただいた回答が直接の解決につながらなかったのであれば、原因と対応を自分でまとめ、自己解決として回答を投稿し、質問を閉じてください。
guest

回答2

0

ベストアンサー

画像のファイル変換を正しく行っていなかったため、出来ませんでした。

投稿2021/04/20 05:12

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

検索しても原因がわかりません。

どんな検索をしましたか?

検索する前にコードは見ないのですか?

実行結果が [Lenna.ppm] is not a ppm-file! なのだから、
コード中のどこでそれを表示しているかを見ると、
90行目の fprintf(stderr, "[%s] is not a ppm-file!\n", fname); です。

これは、46行目の if(c=='3'||c=='6'){ の if文の else の部分だから、
Lenna.ppm の先頭 2バイトのマジックナンバーが "P3" や "P6" ではなかった
ということです。

本当にそうであるかどうか、c を表示するようにしてみるとか、
Lenna.ppm を 16進ダンプしてみるとか、バイナリ―エディタで見てみるとか
してみようとは思いませんか?

投稿2021/04/04 16:25

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問