5

读取和写入 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?

4

3 回答 3

5

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

于 2012-05-22T16:30:33.913 回答
1

文档说它正在解码输入文件,因此它没有作为 PNG 保存在内存中:

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

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

于 2012-05-22T16:33:08.200 回答
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/

于 2012-05-22T16:52:09.210 回答