ImageWriteParam 设置压缩质量不起作用



我正在尝试创建一个应用程序,该应用程序将多个JPG组合成一个大JPG,而无需进行任何压缩。但是在我的测试样本中,当我组合 8 张图像 (800KB) 时,输出只有 280KB。

我在编写代码时将其用作参考。但是无论我在 param.setCompressionQuality(...) 中插入什么值,输出始终为 280KB,并且不会更改。

String name = dir.getName();
System.out.println("Combining images... #" + name);
BufferedImage result = combine(dir);
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(1.0F); // set highest quality
try {
    File outputFile = new File(outputFolder + "\" + name + ".JPG");
    ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
    writer.setOutput(ios);
    writer.write(result);   
} catch (IOException e) {
    e.printStackTrace();
}

dir 是一个文件类型变量,指示我的源文件夹位置。combine() 是一个返回 BufferedImage 的方法。

它不起作用的原因是因为您需要将ImageWriteParam(代码中的param)传递给 write 方法才能生效。

getDefaultWriteParam()方法只会为您创建它,它不会"附着"在writer上。有关详细信息,请参阅 ImageWriter.write API 文档。

然后,代码将如下所示:

BufferedImage result = ...
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
...
writer.setOutput(...);
writer.write(null, new IIOImage(result, null, null), param); // nulls are metadata and thumbnails, don't worry :-)

最新更新