【发布时间】:2012-06-11 00:53:22
【问题描述】:
或者,是否有更好的库来处理压缩?
让我以我已经了解的内容作为开头:(1) JPEG 是有损的——它看起来与输入文件不同。 (2) 我可以将压缩质量设置调整到 0.0 到 1.0 之间,就像我在下面的代码中所做的那样。
我正在使用 BufferedImage 并将其转换为 JPEG,并注意到 Java 的 ImageWriter 的 .write() 方法对 JPEG 图像产生了低于标准的结果(例如,与 Photoshop“保存为 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();
使用压缩质量设置会产生不同的质量输出,但即使设置为“1.0”,它们看起来也不如我在创建 JPEG 时使用其他工具所能得到的那样好。
由于我是新用户,还不能发布图片...here's a webpage that demos the differences。希望我能在某个时候为可能有类似问题的未来用户永久提供它们。
显然,此特定图像不是 JPEG 压缩的最佳候选者(PNG 更小且无损),但它可以更容易地看到压缩伪影。实际图像将主要是摄影性质的。至少,这更多地质疑 Java 的 JPEG 压缩算法和质量,而不是其他产生看起来更接近原始图像且字节数更少的图像。
【问题讨论】:
-
刚刚完成了示例链接,供任何立即看到此内容的人使用。
-
理想的做法是将更好的 JPEG 压缩合并到标准 Java 中;采用开源洁净室实现(GNU/Linux libjpeg?/尤其是 GNU Classpath)并将其移植到 Java。也许在 JUG 的一些支持下,它可能是可行的。
标签: java jpeg image-compression