我想通过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有时比原始版本大。
答案 0 :(得分:2)
使用的压缩质量不与JPEG图像一起存储。
如果您需要低于某个阈值,则必须多次尝试,同时降低压缩质量,直到达到极限。请注意,设置非常低会导致图像质量不佳。
我不熟悉MODE_EXPLICIT标志。它也可能是一个可调参数。
答案 1 :(得分:1)
我找到了降低质量的following代码示例。
重要的部分是设置iwp.setCompressionQuality。希望这会有所帮助。
BufferedImage bi = null;
bi = ImageIO.read(new File("image.jpg"));
Iterator iter = ImageIO.getImageWritersByFormatName("jpeg");
ImageWriter writer = (ImageWriter) iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// reduced quality.
iwp.setCompressionQuality(0.1f);
File file = new File("c:/image_low.jpg");
FileImageOutputStream output = null;
output = new FileImageOutputStream(file);
writer.setOutput(output);
IIOImage image = new IIOImage(bi, null, null);
writer.write(null, image, iwp);
writer.dispose();