【问题标题】:How to prevent loss of image quality while using ImageIO.write() method?使用 ImageIO.write() 方法时如何防止图像质量下降?
【发布时间】:2014-01-18 13:15:50
【问题描述】:

我正在处理 java 中的图像,我在本地磁盘中读取和写入图像。我的问题是在编写图像时,我正在失去我阅读的实际图像的质量。它将图像文件大小的质量从 6.19MB(实际图像大小)文件降低到 1.22MB(使用 ImageIO.write() 写入,这是一个巨大的损失。当我使用时如何防止这种损失

 ImageIO.write(image, "jpg", os);

用于编写图像。 请记住,我在这里不需要任何压缩。只是我想读取图像并以相同的质量和相同的文件大小写入相同的图像。我也试过了,

writer.write(null, new IIOImage(image, null, null), param);

但它会花费我更多的执行时间并执行压缩过程。

请帮我解决这个问题。有没有机会写无损图像质量使用

 ImageIO.write(image, "jpg", os);

还是其他方式?

提前谢谢...!

【问题讨论】:

标签: java image-processing bufferedimage javax.imageio


【解决方案1】:

您似乎对 JPEG 的“压缩”和“质量”有点困惑(我部分归咎于 ImageIO API,因为他们将设置命名为“compressionQuality”)。

JPEG 总是会压缩。这就是格式的重点。如果您不想压缩,JPEG 不是您想要使用的格式。尝试未压缩的 TIFF 或 BMP。正如评论者已经说过的那样,普通的 JPEG 总是有损的(顺便说一句,JPEG-LS 和 JPEG Lossless 是真正不同的算法)。

如果您仍想使用 JPEG,这里有一些帮助。不幸的是,无法使用以下方法控制“compressionQuality”设置:

ImageIO.write(image, "jpg", os);

你需要使用更详细的形式:

ImageReader reader = ...;
reader.setInput(...);
IIOImage image = reader.readAll(0, null); // Important, also read metadata

RenderedImage renderedImage = image.getRenderedImage();

// Modify renderedImage as you like

ImageWriter writer = ImageIO.getImageWriter(reader);
ImageWriteParam param = writer.getDefaultWriteParam();
paran.setCompressionMode(MODE_COPY_FROM_METADATA); // This modes ensures closest to original compression

writer.setOutput(...);
writer.write(null, image, param); // Write image along with original meta data

注意:为清楚起见,try/finally 块和流 close() 和读取器/写入器 dispose() 被省略。你会想要他们在真实的代码中。 :-)

这不应该让你的执行时间明显变长,因为ImageIO.write(...) 在内部使用了类似的代码。

【讨论】:

  • 如果我能得到完整的真实代码,那就太好了。非常感谢..! :-)
  • 看看here,用readAll(0, ...)代替read(0, ...)
猜你喜欢
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-04
  • 1970-01-01
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多