ImageWriteParam 设置压缩质量不起作用
ImageWriteParam set compression quality not working
我正在尝试创建一个应用程序,将多个 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 是一个文件类型变量,指示我的源文件夹位置。
combine() 是 returns BufferedImage.
的方法
之所以不起作用,是因为您需要将ImageWriteParam
(代码中的param
)传递给write
方法才能生效。
getDefaultWriteParam()
方法只会为你创建它,它不会留在"attached"到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 :-)
我正在尝试创建一个应用程序,将多个 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 是一个文件类型变量,指示我的源文件夹位置。 combine() 是 returns BufferedImage.
的方法之所以不起作用,是因为您需要将ImageWriteParam
(代码中的param
)传递给write
方法才能生效。
getDefaultWriteParam()
方法只会为你创建它,它不会留在"attached"到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 :-)