java - ImageWriteParam 设置压缩质量不起作用

标签 java javax.imageio

我正在尝试创建一个应用程序,将多个 JPG 组合成一个大 JPG,无需任何压缩。但在我的测试示例中,当我组合 8 个图像(800KB)时,输出仅为 280KB。

我用了this作为编写代码的引用。但无论我向 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 是一个文件类型变量,指示我的源文件夹位置。 merge() 是一个返回 BufferedImage 的方法。

最佳答案

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

getDefaultWriteParam() 方法只会为您创建它,它不会“附加”到writer。请参阅ImageWriter.write API doc欲了解更多信息。

代码将如下所示:

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 :-)

关于java - ImageWriteParam 设置压缩质量不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29642043/

相关文章:

java - 在匿名对象上调用父类(super class)方法 AsyncTask.execute() new HttpRequestTask<...> extends AsyncTask<...>

java - 如何在java中使用self(php) like关键字?

Java Graphics2D drawString 是 "blacking out"源图像

java - 尝试从 java 中非常大的图像文件读取区域时出错

java - PNG到JPG Java ImageIO问题

java - ImageIO 无法解析为类型

java - 如何从 JFileChooser 获取所选文件的属性

java - 访问Scala变量: 'not found value: variable_name' Issue

java - 使多个 JTextFields 改变颜色 Java

Java将字节[]转换为图像