读取和写入PGM文件

时间:2015-03-18 15:32:15

标签: java pgm

作为家庭作业,我们应该读取.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();

}

当我尝试打开新文件时,我收到一条错误消息,提示&#34;非法图像格式&#34;,原始文件正常打开。

2 个答案:

答案 0 :(得分:0)

使用writeByte方法写入像素是不对的。即使参数是int类型,writeByte也会写一个字节。 (写入参数的八个低位)。

您需要仔细阅读文件格式规范,并确保写出正确的字节数。十六进制编辑器可以提供很多帮助。

答案 1 :(得分:0)

我认为你在某种程度上混淆了PGM格式的二进制(P5)和ASCII(P2)模式。

ASCII版本在每个像素和(可选)换行符之间有空格,就像在代码中一样。

对于二进制格式,您应该只写入像素值(作为字节,因为您有最大值250)。没有空格或换行符。

(我不会为你编写代码,因为这是一项任务,但你几乎就在那里,所以我相信你会成功!: - )

PS:还仔细阅读DataOuputStream.writeUTF(...)上的文档:

  

首先,将两个字节写入输出流,就好像writeShort方法一样,给出了要跟随的字节数。

你确定这是你想要的吗?请记住,PGM格式标题都是ASCII,所以这里真的不需要使用UTF。