java - 在不通过 Java 缩放其宽度/高度的情况下减小 JPEG 图像大小

标签 java image javax.imageio reduce jai

我想通过 Java 缩小一个 jpeg 图像大小(3M 减少到 1M),不缩放(图像高度和宽度不变)。在此站点中,我找不到解决方案。以下是我尝试过的:

1 使用 ImageIO:

BufferedImage image  = ImageIO.read(inputFile);

ImageWriter writer = null;
Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
if(iter.hasNext()){
    writer = (ImageWriter) iter.next();
}

ImageOutputStream ios = ImageIO.createImageOutputStream(outputFile);
writer.setOutput(ios);

ImageWriteParam iwParam = writer.getDefaultWriteParam();
iwParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwParam.setCompressionQuality(compressionQuality);
writer.write(null, new IIOImage(image, null, null ), iwParam);

对于解决方案 1,我为 jpg 设置了 compressionQuality,但我无法获得原始图像 compressQuality,而且有时我得到的 newImage 比原始图像大。

最佳答案

使用的压缩质量不与 JPEG 图像一起存储。

如果您需要低于某个阈值,您必须尝试多次,同时每次都降低压缩质量,直到达到您的极限。请注意,非常低的设置会产生糟糕的图像。

我不熟悉 MODE_EXPLICIT 标志。它也可能是一个可调参数。

关于java - 在不通过 Java 缩放其宽度/高度的情况下减小 JPEG 图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9834850/

相关文章:

java - 寻求有关使用 DAWG 实现文字游戏的建议

java - 如何使用 2D 数组和 JTable 在 Java 中制作棋盘?

java - 如何正确让两个线程更新同一个Collection?

java - Android:通过代码动态插入图像按钮

java - 相当于ImageIO的文件是什么

java - 用于将请求最多的图像存储在 map 对象中的设计模式

java - 将 JPanel 保存为图像(不是文件,而是变量)

Java JPEG 压缩时间

java - Selenium - 写入网络驱动器。可以写入文本文件,但不能写入图像文件

flutter - 如何在 Flutter 中制作圆角图像