如何将 BufferedImage 保存到 pgm 文件?

How do I save a BufferedImage to a pgm file?

我上网查了一下,但找不到答案。我有一个 pgm 文件,我将其用作 BufferedImage 来进行卷积(我为此使用 JAI),但我无法将其保存回 pgm 文件。 到目前为止,我使用以下代码来保存:

JAI.create("filestore", newImage, outputFileName);

有了它,我得到了一个 pgm 文件,但是当我打开图像时,IfranView 告诉我它是一个扩展名不正确的 TIF 文件。我需要更改什么?

感谢您的帮助!如果可能,请提供代码示例。谢谢大家。

亲切的问候, 斯坦尼尔

BufferedImage bufferedImage = ImageIO.read(new File("input file directory...image.png"));

ImageIO.write(bufferedImage, "pgm", new File("output file directory.....image.pgm"));

这应该采用缓冲图像(jpeg、png...等)并将其正确转换为 pgm。

编辑: 可以在 http://www.oracle.com/technetwork/java/index.html

找到允许 .pgm 文件与 ImageIO 一起使用的 JAI 插件

这是我找到的一个例子。未测试。

// Create the OutputStream.
OutputStream out = new FileOutputStream(fileToWriteTo);
// Create the ParameterBlock.
PNMEncodeParam param = new PNMEncodeParam();
param.setRaw(true.equals("raw"));
//Create the PNM image encoder.
ImageEncoder encoder = ImageCodec.createImageEncoder("PNM", out, param);

Writing PNM Files

我找到了答案。我已经将外部 JAI imageio 添加到我的库中。

ImageIO.write(bufferedImage, "pnm", new File("output file directory.....image.pgm"));

而不是 "pgm" 它应该说 "pnm"。新文件将自动具有 pgm 扩展名。

可能晚了,但我刚写了一篇。一个简单的 PGM 编写器采用一个 2d-double 数组,其值在 [0.0,1.0].

范围内
    public static void WritePGM(string fileName, double[,] bitmap)
    {
        var width = bitmap.GetLength(0);
        var height = bitmap.GetLength(1);
        var header = "P5\n" + width + " " + height + "\n255\n";
        var writer = new BinaryWriter(new FileStream(fileName, FileMode.Create));
        writer.Write(System.Text.Encoding.ASCII.GetBytes(header));
        for (var j = 0; j < height; j++)
        {
            for (var i = width-1; i >= 0; i--)
            {
                var c = (byte)(System.Math.Max(System.Math.Min(1.0, bitmap[i, j]), 0.0) * 255.0);
                writer.Write(c);
            }
        }
        writer.Close();
    }