在阅读和编写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,不需要任何本机代码?
答案 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/