我有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);
}
答案 0 :(得分:1)
通过使用用于校正原始图像的相同量化表,可以最大限度地减少重新压缩JPEG的质量损失。仍然可以从舍入中获得单个位错误,但是你可以非常接近它。
问题是如何获得量化表。如果您的编码将允许您指定它们,则可以从源图像中提取值。否则,您必须希望图像最初使用相同的编码器进行编码。
"质量价值"不属于JPEG。它们是用于选择某些编码器使用的量化表的方法。 LIBJPEG是最常见的编码器,但还有其他人以不同的方式做事。
PNG编码通常比JPEG慢。