- ベストアンサー
組織的ディザ法プログラムの問題とP2フォーマットへの変更方法
- 組織的ディザ法プログラムが正しく動作しない理由を教えてください。
- PGM画像のフォーマットをP2(アスキー)に変更する方法を教えてください。
- 組織的ディザ法プログラムを修正してP2フォーマットを読み込むように変更したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
P2形式のPGMに対応したいのであれば、画像読み込みルーチンの方をP2に対応させる必要がありますが、 今回挙げられているディザ処理そのものは、今のままでまったく問題はありません。 画像読み込み部の対応ですが、ヘッダ部はP5もP2も同じです。 実データ読み取り部で、P2だった時は fgetc の代わりに、 --- int value; fscanf(fp, "%d", &value); image[y][x] = value; --- といったコードにするだけでいけます。 あと、今回の質問とは直接関係ありませんが、 4×4のディザの階調数は16ではなく17です。(「1が0個」~「1が16個」の17通り) 今のコードだと、一番明るい白が輝度値15にしていますが、15の時は4x4の左下が0になってしまい、全面白ではなく、黒の点が出てきます
その他の回答 (1)
- mtaka2
- ベストアンサー率73% (867/1179)
・P2(テキスト)形式のpgmは、ファイルの先頭(1行目)が「P2」で始まります。 ・P5(バイナリ)形式のpgmは、ファイルの先頭(1行目)が「P5」で始まります。 > if (buffer[0] != 'P' || buffer[1] != '5') このif文は、「1文字目がP以外」もしくは「2文字目が5以外」だったら、真になり、printfとexitを実行します。 その結果、2文字が「P5」だった時にかぎり、exitしないという動作になります。 ですから「P2専用」にするなら、ここの「5」を「2」にすればOKです。 余力があるなら、「P2」と「P5」のどちらでも終了しないようにして、 P2のときはデータ読み込みにfscanfを使い、P5の時はfgetc、と使い分けるようなコードにした方がいいでしょう。
お礼
わかりました。ありがとうございます。 色々と問題があるのでまた質問するかもしれませんが、そのときはよろしくお願いします。
補足
コンパイルに成功し、P2のPGMデータも読み込み、ディザ画像を作ることに成功しました。本当にありがとうございます。 しかし、その画像が真っ黒でした… どうしてなのでしょうか? 何度も初心者の質問をしてしまい、本当にすいません。
補足
mtaka2さん 回答ありがとうございます。 mtaka2さんの言われたとおりに int value; fscanf(fp, "%d", &value); image[y][x] = value; に変更いたしましたが、P2のPGMファイルを読み込むと 「ファイルのフォーマットがP5ではありません」 と出てきて、操作を終了してしまいます。 下記のプログラムを変えなければならないのでしょうか? 初心者のために答えがわかりません。教えていただけないでしょうか。 fgets(buffer, MAX_BUFFERSIZE, fp); if (buffer[0] != 'P' || buffer[1] != '5') { printf(" ファイルのフォーマットがP5ではありません\n\n"); exit(1);