如何将BufferedImage以无压缩的PNG格式进行写入?

5

我需要将BufferedImage以无压缩的方式写成.png格式。我查找了一些资料,得到以下代码。

public void save(String outFilePath) throws IOException {
    Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("png");
    ImageWriter writer = iter.next();

    File file = new File(outFilePath);      
    ImageOutputStream ios = ImageIO.createImageOutputStream(file);
    writer.setOutput(ios);

    ImageWriteParam iwp = writer.getDefaultWriteParam();
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    iwp.setCompressionQuality(1.0f);

    IIOImage image = new IIOImage(mapImage, null, null);

    writer.write(null, image, iwp);
    writer.dispose();

    //ImageIO.write(mapImage, "png", file);
}

这里是抛出的异常。

Exception in thread "main" java.lang.UnsupportedOperationException: Compression not supported.
    at javax.imageio.ImageWriteParam.setCompressionMode(Unknown Source)
    at Map.MapTransformer.save(MapTransformer.java:246)
    at Map.MapTransformer.main(MapTransformer.java:263)

如果你不打算压缩它,为什么不使用BMP格式? - radai
1
也许你应该使用 MODE_DISABLED。 - NovaDenizen
此外,启用PNG压缩的唯一缺点是操作略微昂贵。 PNG是无损的,因此压缩对图像质量没有不良影响。 - NovaDenizen
1
@CamHart:嘿,你能告诉我们你是如何解决这个问题的吗?我知道这个问题很久以前就被问到了。 - Sasi Kathimanda
@CamHart,你找到解决方案了吗? - Half Blood Prince
1个回答

2
PNG图像通过先应用预测滤镜(您可以在五个变体中选择),然后使用ZLIB压缩预测误差来实现压缩。您不能省略这两个步骤,您可以做的是指定“NONE”作为预测滤镜,并且将compressionLevel=0用于ZLIB压缩,这大致对应于非压缩图像。 javax.imageio.*包不允许(我认为)选择这些参数,也许您可以尝试使用thisthis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接