java - 在不损失质量的情况下读取/写入 JPG 图像的最快方法?

标签 java image image-processing groovy jpeg

我有 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/

相关文章:

java - 将方法实现到按钮监听器中时出错

java - 用于多语言编程的 IDE

java - SoapUI、Maven、Surefire 和 Jenkins 集成

math - 我们如何识别一组近似矩形的像素?

java - 2d DCT 程序不工作

java - 运行时异常 : Unable to instantiate activity ComponentInfo . .. ClassNotFoundException

用于创建包含三个 code128 条形码的图像的 Java 代码

css - 背景图像 CSS 的响应式重新缩放

php - 在 PHP 中将 JPG/GIF 图像转换为 PNG?

algorithm - 如何确定哪些纵横比最接近