Java 读/写JPG图像而不丢失质量的最快方法?

Java 读/写JPG图像而不丢失质量的最快方法?,java,image,image-processing,groovy,jpeg,Java,Image,Image Processing,Groovy,Jpeg,我有JPG图像文件,我想将其加载到BuffereImage中,然后将BuffereImage写回JPG文件。以下是我目前正在做的事情 有没有更好的方法不降低质量并加快读/写速度 阅读: BufferedImage image = ImageIO.read(new File(storagePath + fileName + extension)); 写: BufferedImage image = // some jpg image Iterator iter = Image

我有JPG图像文件,我想将其加载到BuffereImage中,然后将BuffereImage写回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慢

通过使用用于校正原始图像的相同量化表,可以将重新压缩JPEG时的质量损失降至最低。通过舍入仍然可以得到单位错误,但可以非常接近

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

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


PNG编码通常比JPEG慢

我没有做任何基准测试,但PNG可能更快。PNG总是无损的。我知道,但它需要更多的内存。这不是我的问题,看看这个:写JPEG总是会失去质量。即使在100%的质量。这是JPEG的一个特性。如果需要精确复制源像素,请使用不同的格式,如PNG、JPEG2000(无损模式)、JPEG-LS(无损模式)、TIFF或类似格式。@haraldK你能用代码给出答案吗?我没有做任何基准测试,但PNG可能更快。PNG总是无损的。我知道,但它需要更多的内存。这不是我的问题,看看这个:写JPEG总是会失去质量。即使在100%的质量。这是JPEG的一个特性。如果需要精确复制源像素,请使用不同的格式,如PNG、JPEG2000(无损模式)、JPEG-LS(无损模式)、TIFF或类似格式。@haraldK您能用代码发布一个答案吗?使用JPEG-LS我必须做些什么?