[英]How to prevent loss of image quality while using ImageIO.write() method?
我正在處理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,這里有一些幫助。 不幸的是,無法使用以下方法控制“ 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(...)
內部使用了類似的代碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.