2009-06-08 47 views
3

我使用下面的代碼將gif文件轉換爲jpg文件,它可以工作,但結果jpg文件與原始gif文件的質量不同,爲什麼?任何方式來提高質量?爲什麼我從gif文件轉換的jpg文件不夠清晰?

try 
{ 
    ImageIO.write(ImageIO.read(new File("C:/abc.gif")),"jpg",new File("C:/abc.jpg")); 
} 
catch (Exception e) { e.printStackTrace(); } 

那麼,從另一個角度來問這個問題,用上面的方法,如何提高輸出質量呢?

+0

另請參閱:http://stackoverflow.com/questions/2336522/png-vs-gif-vs-jpeg-when-best-to-use – 2013-03-31 16:30:18

回答

20

JPEG是一個lossy image compression格式,丟棄了人眼無法很好地注意到的信息。但是,根據壓縮圖像時的圖像質量設置,可能會看到塊狀和污跡等compression artifacts - 這是圖像看起來不清晰的原因。

ImageIO.write方法可能會以較低的質量設置保存JPEG,這些設置比保留圖像看起來不夠好的必要設置要低。

爲了將質量設置設置得更高,需要使用ImageWriteParam指定圖像質量設置,然後使用ImageWriter輸出JPEG。

例如:

感興趣
// Get a writer for JPEG. 
ImageWriter iw = ImageIO.getImageWritersByFormatName("jpeg").next(); 
iw.setOutput(new FileImageOutputStream(outputFile)); 

// Set the compression quality to 0.9f. 
ImageWriteParam iwParam = iw.getDefaultWriteParam(); 
iwParam.setCompressionQuality(0.9f); 

// Write image 
iw.write(null, new IIOImage(imageToWrite, null, null), iwParam); 

方法:

這就是說,作爲其他的答案提到,JPEG是不適合的壓縮文本和插圖。如果目標是保持圖像質量,但文件大小可能比使用JPEG壓縮時大,則使用PNG等格式將保持原樣的圖像質量,不會有任何損失。但是,在很多情況下,PNG文件的文件大小將大於JPEG。 (但情況並非總是如此)

一般的經驗法則是,對於照片和其他逼真圖像,有損壓縮格式(如JPEG)對於文件大小與質量的折衷很適用,而無損壓縮諸如PNG等格式將更好地用於插圖和線條藝術,其中大部分區域具有相似的顏色並且具有很小的漸變效果。

5

JPEG保證了保真度的一些損失;這就是它如何實現壓縮。你可以選擇一個不同的塊大小來儘量減少僞像,但是會出現僞像。

GIF無損,JPEG有損; abc.jpg永遠不會像abc.gif一樣。

+2

JPEG標準有一個無損部分,但沒有人打擾實現ist :) – Joey 2009-06-08 23:57:02

+2

雖然GIF是無損的,但值得注意的是它是一種無損的_indexed_顏色格式,所以從Truecolor源保存時會丟失一些顏色信息。 JPEG是一種有損的真彩色格式,因此索引圖像被上轉換爲真彩色(質量沒有改進),然後在JPEG/DCT意義上「平均出來」(質量相應降低)。 – Stobor 2009-06-09 00:03:01

11

JPEG對於內部帶有文本的圖像特別不利。 .PNG是一個很好的選擇。

2

粗略地說,JPEG適用於本質上是攝影的圖像。如果圖像的顏色變化很大,具有自然元素並且類似於實時環境,那麼JPEG將提供高質量且沒有可見的僞像。

如果圖像被繪製出來,或者包含一大片單色並且不是照片,那麼使用PNG可以更好地壓縮圖像。這是一種可以做32位顏色的無損格式。

你應該幾乎從不使用GIF格式的圖像 - 格式只支持8位顏色,並提供相對較差的壓縮。