1

我有 JPG 图像文件,我想将其加载到 BufferedImage 中,然后将 BufferedImage 写回 JPG 文件中。这是我目前正在做的事情。

有没有更好的方法来不损失质量并使读/写更快?

读:

BufferedImage image = ImageIO.read(new File(storagePath + fileName + extension));

写:

BufferedImage image = // some jpg image         

Iterator iter = ImageIO.getImageWritersByFormatName("JPG");
if (iter.hasNext()) {
    ImageWriter writer = (ImageWriter) iter.next();
    ImageWriteParam iwp = writer.getDefaultWriteParam();
    iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
    iwp.setCompressionQuality(quality);

    File outFile = new File(storagePath + fileName + extension);
    FileImageOutputStream output = new FileImageOutputStream(outFile);
    writer.setOutput(output);
    IIOImage iioImage = new IIOImage(image, null, null);
    writer.write(null, iioImage, iwp);
}
4

1 回答 1

1

通过使用用于校正原始图像的相同量化表,您可以最大限度地减少重新压缩 JPEG 时的质量损失。舍入仍然可能会出现单位错误,但您可以非常接近。

问题是如何获得量化表。如果您的编码允许您指定它们,您可以从源图像中提取值。否则,您必须希望图像最初是使用相同的编码器编码的。

“质量值”不是 JPEG 的一部分。它们是一种选择某些编码器使用的量化表的方法。LIBJPEG 是最常见的编码器,但也有其他的编码器做不同的事情。

PNG 编码通常比 JPEG 慢。

于 2014-03-26T04:50:37.470 回答