2014-01-18 45 views
2

我正在處理java中的圖像,我在本地磁盤中讀取和寫入圖像。我的問題是在寫圖像時,我失去了我讀的實際圖像的質量。它減少了圖像文件大小從6.19MB質量(實際圖像尺寸)文件1.22MB(使用ImageIO.write(),這是大量損失寫的。我怎樣才能避免這種損失,當我使用如何防止在使用ImageIO.write()方法時丟失圖像質量?

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

對於 寫入圖像。請記住,我不需要在這裏進行任何壓縮,只是我想讀的形象,寫有相同的質量和相同的文件大小相同的圖像。我也試過,

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

,但它需要我執行時間更多並且執行壓縮過程。

請幫我解決這個問題。是否有機會使用

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

或任何其他的方式來寫無損圖像質量?

在此先感謝...!

+0

JPG是有損壓縮,[this](http://stackoverflow.com/questions/6064227/java-saving-original-jpeg-without-loss)可能對你有幫助。 –

+0

可能重複的[如何實現JPEG無損?](http://stackoverflow.com/questions/17187880/how-to-achieve-jpeg-無損) –

+0

嘗試過的字節[],但它增加了太大的文件大小:-( –

回答

3

您似乎對JPEG「壓縮」和「質量」有點困惑(我將它部分歸咎於ImageIO API,因爲它們將設置命名爲「compressionQuality」)。

JPEG總是要壓縮。這就是格式的要點。如果你不想壓縮,JPEG不是你想要使用的格式。嘗試未壓縮的TIFF或BMP。正如評論者所說,正常的JPEG總是會有損(JPEG-LS和JPEG無損是真正不同的算法)。

如果你仍然想要使用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(...)在內部使用類似的代碼。

+0

如果我得到完整的真實代碼,這將是很好的。非常感謝..!:-) –

+0

看看[這裏](https://github.com/haraldk/TwelveMonkeys#advanced-usage),只是使用'readAll(0,...)'而不是'read(0,...)'。 – haraldK

+0

好的,我正在努力...感謝您的幫助。 –

相關問題