質問

CプログラムにPGMファイルを書き込もうとしていますが、書き込まれたら、画像を表示しようとした場合、イメージファイルの形式を判断できません。

しかしながら、Geneyで新しいファイルを作成した場合は、データをコピーしてから新しい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");
}
.

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

役に立ちましたか?

解決

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

pixel11 pixel12 pixel13
pixel14 pixel15
# switch to next row
pixel21 pixel22 pixel23
pixel24 pixel25
# etc.
.

他のヒント

あなたのコードを見ると、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");
    }
    
    .

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top