我在 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);
还是其他方式?
提前致谢...!
最佳答案
您似乎对 JPEG“压缩”和“质量”有点困惑(我部分地将此归咎于 ImageIO API,因为他们将设置命名为“compressionQuality”)。
JPEG 总是要压缩的。这就是格式的重点。如果您不想压缩,那么 JPEG 不是您要使用的格式。尝试未压缩的 TIFF 或 BMP。正如评论者已经说过的那样,普通的 JPEG 总是有损的(顺便说一句,JPEG-LS 和 JPEG Lossless 是真正不同的算法)。
如果您仍想使用 JPEG,这里有一些帮助。不幸的是,无法使用以下方式控制“压缩质量”设置:
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
block 和流close()
以及读取器/写入器dispose()
。你会想要他们在真正的代码中。 :-)
这实际上不会使您的执行时间明显变长,因为 ImageIO.write(...)
在内部使用类似的代码。
关于java - 使用 ImageIO.write() 方法时如何防止图像质量下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204627/