2011-07-23 31 views
1

高品質のサムネイル画像を生成するために以下のコードを試しましたが、サムネイルがぼやけてしまいました。Javaの高品質画像から低品質のサムネイルを取得

BufferedImage thumbImage = new BufferedImage(thumbWidth, thumbHeight, BufferedImage.TYPE_INT_RGB); 
Graphics2D graphics2D = thumbImage.createGraphics(); 
graphics2D.setBackground(Color.WHITE); 
graphics2D.setPaint(Color.WHITE); 
graphics2D.fillRect(0, 0, thumbWidth, thumbHeight); 
graphics2D.setComposite(AlphaComposite.Src); 
graphics2D.setRenderingHint(RenderingHints.KEY_INTERPOLATION,RenderingHints.VALUE_INTERPOLATION_BILINEAR); 
graphics2D.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); 
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 
graphics2D.drawImage(image, 0, 0, thumbWidth, thumbHeight, null); 
graphics2D.dispose();  
File file = new File(thumbnailFile); 
if (javax.imageio.ImageIO.write(thumbImage, "JPG", file)) 
    return file; 
} 

元画像は高画質画像です。サムネイル画像が歪んで低品質になるのはなぜですか?

+0

なぜは、コンポジットを追加しますか? – extraneon

+0

私は今、透明度を得ていました。なぜなら、私は、rectina eyeディスプレイを使用していたので、ピクセルサイズは明確になるためです。たとえば:70 * 70は210 * 210でなければなりません。これにより、明瞭さが得られます。 – Antony

答えて

10

コードを見てから、二つの可能性があります

  1. 元の画像が非常に大きく、サムネイルは非常に小さく、簡単bilinear interpolationにより分解された画像品質が得られるが。

  2. JPEG符号化の結果であるcompression artifactsは、サムネイルの品質を低下させています。元画像とサムネイルは200×200から100×100に行く、例えば、全体の多くによってサイズが異なるしない場合は、単純な双一次補間を使用して

は十分なことができます。

しかし、サムネイルサイズの画像に大きな(1600x1200など)画像をサイズ変更する場合は、双線形補間(および双三次補間)を行う必要があります。そのため、多段階リサイズなどの代替技術を使用する必要があります。

記事The Perils of Image.getScaledInstance() Chris Campbellの詳細については、大きな画像を縮小すると画質が低下する可能性があります。

チェットハーゼとロマン・ガイの本Filthy Rich Clientsも高品質のサムネイルを作成に関するいくつかの詳細に入ります。


Iは、多段階で使いやすいAPIを使用して高品質のサムネイルを作成するために、サイズ変更などの技術を使用しThumbnailator呼ばれるサムネイル生成ライブラリを維持します。

たとえば、あなたの例のコードは次のようThumbnailatorを使って書くことができます

Thumbnails.of(image) 
    .size(thumbWidth, thumbHeight) 
    .outputFormat("JPG") 
    .toFile(file); 

圧縮アーチファクトが画質劣化を引き起こしている場合には、圧縮品質の設定を指定することも可能です:

Thumbnails.of(image) 
    .size(thumbWidth, thumbHeight) 
    .outputFormat("JPG") 
    .outoutQuality(0.9) 
    .toFile(file); 
+0

ご協力いただきありがとうございます。 – Antony

+0

@Antonyあなたは大歓迎です:) – coobird

関連する問題