0

CプログラムでPGMファイルを書き込もうとしていますが、一度書き込んだ後、開いて画像を表示しようとすると、画像のファイル形式がわからないと言われます。

ただし、geanyで新しいファイルを作成し、データをコピーして、それを新しいPGMとして保存すると、機能します。

なぜこれが可能であるかについて何か考えはありますか?

FILE * grey = fopen("greyscale.pgm", "w");

fprintf(grey, "P2 \r\n%d %d \r\n255 \r\n", width, height);

for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
        fprintf(grey, "%d ", ((imageArray[i][j].red + imageArray[i][j].green + imageArray[i][j].blue)/3));
    }
    fprintf(grey, "\r\n");
}

カラー画像をグレースケールに変換しています。

4

2 に答える 2

1

コードを見ると、new lineすべてheightの要素を挿入していることがわかります。PGMファイル形式によると、ヘッダーの後、次のようになります。

  • 上から下の順に、高さ行のラスター。各行は、左から右の順に、幅のグレー値で構成されます。

しかし、あなたは高さ要素の行を書いています。したがって、おそらく間違った方法でデータにアクセスしています。実際、3列(幅)と4行(高さ)の画像を(鉛筆で)デバッグしてみてください。

そうは言っても、データを行優先の順序で書き込むようにループを変更します。

// write data to file
int row, col;
for (row = 0; row < height; ++row)
{
    for (col = 0; col < width; ++col)
    {
        fprintf(grey, "%d ", (imageArray[row][col].red + imageArray[row][col].green + imageArray[row][col].blue)/3));
    }
    fprintf(grey, "\n\r");
}
于 2012-02-27T17:03:25.883 に答える
1

\r\n行区切り文字として使用するのではなく、。のみを使用する必要があると思います\n。また、70文字を超える行がないことを確認してください。各ピクセルには最大4文字(3プラススペース)が必要なので、\n17ピクセルごとに挿入します。コメントで実際の行を区切ることができます(例:

pixel11 pixel12 pixel13
pixel14 pixel15
# switch to next row
pixel21 pixel22 pixel23
pixel24 pixel25
# etc.
于 2012-02-28T09:07:44.863 に答える