3

次のコードを使用して gif ファイルを jpg ファイルに変換します。機能しますが、結果の jpg ファイルは元の gif ファイルと同じ品質ではありません。なぜですか? 品質を向上させる方法はありますか?

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

では、この質問を別の角度から尋ねると、上記のアプローチで、出力品質を向上させるにはどうすればよいでしょうか?

4

4 に答える 4

20

JPEG非可逆画像圧縮形式であり、人間の目では認識できない情報を破棄します。ただし、画像を圧縮するときの画質設定によっては、ブロック状やにじみなどの圧縮アーティファクトが表示されることがあります。これが、画像が鮮明に見えない原因です。

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 などの可逆圧縮形式は、イラストや線画に適しています。グラデーション効果がほとんどない同系色の大きな領域があります。

于 2009-06-08T23:49:22.730 に答える
11

JPEG は、テキストを含む画像には特に適していません。良い代替案は .PNG です。

于 2009-06-08T23:50:23.087 に答える
5

JPEG では、忠実度がいくらか失われることが保証されています。それが圧縮を達成する方法です。アーティファクトを最小限に抑える別のブロック サイズを選択することもできますが、アーティファクトが発生します。

GIF はロスレスで、JPEG はロッシーです。abc.jpg は、abc.gif と同等のピクセルになることはありません。

于 2009-06-08T23:48:39.407 に答える
2

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

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

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

于 2009-06-08T23:55:11.080 に答える