读取和写入PGM文件

  • 本文关键字:PGM 文件 读取 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();
}

当我试图打开新文件时,我收到一条错误消息,说"非法图像格式",原始文件正确打开。

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

您需要仔细阅读文件格式规范,并确保写入的字节数正确。十六进制编辑器有很大帮助。

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

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

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

(我不为你写代码,因为这是一项任务,但你已经快到了,所以我相信你会成功的!:-)

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

首先,将两个字节写入输出流,就像通过writeShort方法给出后面的字节数一样。

你确定这是你想要的吗?请记住,PGM格式的头都是ASCII,所以这里真的没有必要使用UTF。

最新更新