【问题标题】:Reading and Writing a PGM file读取和写入 PGM 文件
【发布时间】:2015-03-18 15:32:14
【问题描述】:

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

}

当我尝试打开新文件时,我收到一条错误消息,提示“非法图像格式”,并且原始文件可以正常打开。

【问题讨论】:

  • @Obicere "我们应该读取 .pgm 文件" 问题是原始文件是二进制文件还是 ASCII。
  • @Obicere 原文件是.pgm文件
  • @LutzHorn 它的 P5 是一个二进制文件。现在阅读教程,谢谢!
  • @LutzHorn 我不确定如何以这种方式操纵这些值

标签: java pgm


【解决方案1】:

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

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

【讨论】:

  • 是的。我可以使用 writeChar,因为它写入了一个 2 个字节的 int,每个像素要么是 1 个字节,要么是 2 个字节,对吗?是否也会通过它使用 writeUTF,或者因为每个之间允许多个空格而使用 writeUTF?还是我完全错了, dataOutputStream 不是要走的路
  • 我不知道这种格式的细节,但通常一个像素是4个字节(红、绿、蓝,可能还有一个alpha通道)
  • @lbalazscs PGM 是便携式 灰色 地图。因此一个像素总是 1 或 2 个字节(16 位为 2 个字节,或max &gt; 255)。没有 R、G、B 或 A。:-)
【解决方案2】:

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

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

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

(我不为你写代码,因为这是一个作业,但你快到了,所以我相信你会成功的!:-)

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

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

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

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-10
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 2015-09-17
    相关资源
    最近更新 更多