-1

宿題として、.pgm ファイルを読み込み、ピクセル値を変更して正方形を描画し、新しい画像を出力することになっています。ピクセルを調べて変更した後、実際に追加されたことを確認する方法として、ピクセルをすべて .txt に出力します。私が問題を抱えているのは、新しいファイルの書き込みです。バイナリであることがわかっているので、グーグルで検索した後、DataOutputStreamを使用する必要があると思いますが、間違っている可能性があります。ファイルを書き込んだ後、そのサイズは 1.9MB ですが、元のファイルは 480KB しかないので、すぐに何か問題があるのではないかと思います。.pgm ファイルへの書き込みに関するアドバイスやヒントをいただければ幸いです。

public static void writeImage(String fileName) throws IOException{
    DataOutputStream writeFile = new DataOutputStream(new FileOutputStream(fileName)); 
     // Write the .pgm header (P5, 800 600, 250) 
    writeFile.writeUTF(type + "\n");
    writeFile.writeUTF(width + "  " + height + "\n");
    writeFile.writeUTF(max + "\n");

    for(int i = 0; i < height; i++){
        for(int j = 0; j < width; j++){
            writeFile.writeByte(img[i][j]); //Write the number
            writeFile.writeUTF(" "); //Add white space
        }
        writeFile.writeUTF(" \n"); //finished one line so drop to next
    }
    writeFile.close();

}

新しいファイルを開こうとすると、「不正な画像形式」というエラー メッセージが表示され、元のファイルは正しく開きます。

4

2 に答える 2

0

PGM 形式のバイナリ (P5) モードと ASCII (P2) モードを混同していると思います。

ASCII バージョンでは、コードにあるように、各ピクセルと (オプションの) 改行の間にスペースがあります。

バイナリ形式の場合、ピクセル値を書き込むだけです (最大値が 250 であるため、バイトとして)。スペースや改行はありません。

(これは課題なので、私はあなたのためにコードを書きません。

PS: のドキュメントも注意深くお読みくださいDataOuputStream.writeUTF(...):

最初に、後続のバイト数を指定する writeShort メソッドによるかのように、2 バイトが出力ストリームに書き込まれます。

これでよろしいですか?PGM 形式のヘッダーはすべて ASCII であるため、ここで UTF を使用する必要はありません。

于 2015-03-23T11:32:49.890 に答える
0

writeByte メソッドを使用してピクセルを書き込むのは正しくありません。引数が int 型であっても、writeByte は 1 バイトを書き込みます。(引数の下位 8 ビットが書き込まれます)。

ファイル形式の仕様を注意深く読み、正しいバイト数を書き出す必要があります。16 進エディタは大いに役立ちます。

于 2015-03-18T15:57:37.750 に答える