或者,是否有更好的库来处理压缩?
让我用我已经理解的内容作为序言:(1)JPEG是有损的 - 它看起来与输入文件不一样.(2)我可以将压缩质量设置调整到0.0到1.0之间,正如我在下面的代码中所做的那样.
我正在使用BufferedImage并将其转换为JPEG,并注意到Java的ImageWriter的.write()方法为JPEG图像生成了低于标准的结果(与Photoshop"Save for Web"相比,作为示例).
我的代码现在看起来有点像这样:
// img is a BufferedImage, here
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(.75f);
IIOImage image = new IIOImage(img, null, null);
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
writer.setOutput(ImageIO.createImageOutputStream(byteArrayOut));
writer.write(null, image, iwp);
writer.dispose();
Run Code Online (Sandbox Code Playgroud)
使用压缩质量设置会产生不同的质量输出,但即使设置为"1.0",它们也不像创建JPEG时的其他工具那样好.
由于我是新用户,无法发布图片...... 这是一个演示差异的网页.希望我可以在某些时候永久地让他们进入这里,以便将来可能有类似问题的用户.
显然,这个特定的图像不是JPEG压缩的最佳候选者(PNG更小,无损),但它可以更容易地看到压缩伪像.实际的图像本质上主要是摄影的.至少,这更多地质疑Java的JPEG压缩算法和质量,而不是那些产生更接近原始图像的图像.