使用Java进行PNG读写会增加文件大小

时间:2012-05-22 16:25:52

标签: java image-processing

在阅读和编写png文件时遇到问题。我用ImageIO将其读取为字节数组,然后使用ImageIO再次写入该字节数组。但文件大小显着增加。怎么会发生这种情况?

public BufferedImage toBufferedImage(InputStream inputstream) {
    try {
        return ImageIO.read(inputstream);
    } catch (Exception e) {
        throw new IllegalStateException("Can't convert to buffered image", e);
    }
}

public byte[] toByteArray(BufferedImage bufferedImage, String filetype) {
    ByteArrayOutputStream output = new ByteArrayOutputStream();
    try {
        ImageIO.write(bufferedImage, filetype, output);
        return output.toByteArray();
    } catch (Exception e) {
        throw new IllegalStateException(e);
    }
}

跟进:是否有任何库支持用Java编写的压缩PNG,不需要任何本机代码?

3 个答案:

答案 0 :(得分:5)

这很可能是因为Java和创建原始PNG的压缩算法不同。

答案 1 :(得分:1)

documentation说它正在解码输入文件,因此它不会作为PNG保存在内存中:

  

返回一个BufferedImage,作为使用从当前注册的ImageReader中自动选择的ImageReader解码提供的文件的结果。 File包含在ImageInputStream中。如果没有已注册的ImageReader声称能够读取生成的流,则返回null。

当它写回来时,它必须重新编码PNG文件,而Java的PNG编码似乎不如创建原始文件的效率高。

答案 2 :(得分:1)

JDK提供的PNG编写器不支持压缩。您可以使用以下命令快速检查:

w = ImageIO.getImageWritersByFormatName("png").next();
p = w.getDefaultWriteParam();
print("Can compress? "+p.canWriteCompressed());
// Can compress? false

imageio-ext或jai-imageio可能包含具有压缩支持的png编写器:http://java.net/projects/imageio/