使用ImageIO.write()方法时如何防止图像质量下降?

时间:2014-01-18 13:15:50

标签: java image-processing bufferedimage javax.imageio

我在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);

还是其他任何方式?

提前致谢...!

1 个答案:

答案 0 :(得分:3)

你似乎对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(...)在内部使用类似的代码。