2009-06-08 4 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 –

答えて

20

JPEGは、人間の目が非常によく気づくことができない情報を捨てるフォーマットであるlossy image compressionである。ただし、画像を圧縮するときの画質設定によっては、ブロックや汚れなどの画像が表示されることがあります。これが画像の背景にはっきりと現れない理由です。

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の圧縮よりもファイルサイズが大きくなる場合は、lossless image compressionの形式、たとえばPNGを使用すると、そのまま画像の品質が失われることはありません。ただし、多くの場合、PNGファイルのファイルサイズはJPEGよりも大きくなります。

写真やその他の現実的な画像では、JPEGなどの非可逆圧縮形式は、ファイルサイズと品質のトレードオフに対してはうまく機能しますが、可逆圧縮PNGのようなフォーマットは、グラデーション効果の少ない類似した色の広い領域があるイラストやラインアートの方が効果的です。

+0

偉大な、それは "ほとんど"私が期待どおりに動作します!しかし興味深いことに気付いたことがあります.PNGイメージを読み込み、CompressionQualityを1.0fに設定しました。出力は元のイメージのように見えましたが、ライトブルーはダークブルーとして出てきました。 、私は気にしない、それがうれしい!ありがとう! 次の図で試すことができます: http://ichart.finance.yahoo.com/z?s=ibm&t=6m&q=b&l=off&z=m&p=&a=v,r14,ss,w14 – Frank

+0

@Frank :1.0fの圧縮品質でさえ、圧縮は損失になるので、出力の品質は元のものと同じになりません。私は過去の色の変化を観察したので、おそらく損失圧縮の効果の1つです。 – coobird

5

JPEGは、忠実度の低下を保証します。それが圧縮を達成する方法です。アーティファクトを最小限に抑えるブロックサイズを選択できますが、アーティファクトが存在します。

GIFは可逆でJPEGは不可逆です。 abc.jpgはabc.gifと同じピクセルになることはありません。

+2

JPEG規格のロスレス部分がありますが、誰も気にしませんistを実装してください:) – Joey

+2

GIFはロスレスではありませんが、無損失の_indexed_カラーフォーマットであることに注意する価値があります。したがって、Truecolorソースから保存すると色情報が失われます。 JPEGは損失の多いトゥルーカラーフォーマットであるため、インデックス付きイメージはトゥルーカラー(品質の向上なし)にアップコンバートされ、JPEG/DCTの意味で(品質の低下に伴って)「平均化」されます。 – Stobor

+0

GIF標準の損失部分もあります。一言、物事はそれほど単純ではありません:) – zildjohn01

11

JPEGは、テキストが内部にある画像に特に悪いです。良い選択肢は.PNGです。

2

大まかに言えば、JPEGは本質的に写真である画像に適しています。画像が色の変化が大きく、自然な要素を持ち、ライブ環境に似ている画像の場合、JPEGは目に見えるアーティファクトのない良好な品質を提供します。

画像が描画されている場合、または単色の大きなスウォッチが含まれていて写真でない場合は、画像はPNGを使用してよりよく圧縮されます。これは、32ビットカラーを実行できるロスレスフォーマットです。

最近ではGIF形式の画像を使用することはほとんどありません。この形式は8ビットカラーのみをサポートし、圧縮率は比較的低くなっています。