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