我有 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);
}
最佳答案
通过使用与校正原始图像相同的量化表,您可以最大限度地减少重新压缩 JPEG 时的质量损失。舍入仍有可能产生单位错误,但您可以得到非常接近的错误。
问题是如何获取量化表。如果您的编码允许您指定它们,您可以从源图像中提取这些值。否则,您必须希望图像最初是使用相同的编码器进行编码的。
“质量值”不是 JPEG 的一部分。它们是一种选择某些编码器使用的量化表的方法。 LIBJPEG 是最常见的编码器,但还有其他编码器的工作方式有所不同。
PNG 编码通常比 JPEG 慢。
关于java - 在不损失质量的情况下读取/写入 JPG 图像的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18559163/