2011-07-23 85 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眼图显示,所以像素尺寸必须更多以获得清晰度。例如:70 * 70必须是210 * 210,这样才能得到清晰。 – Antony

回答

10

有从看代码两种可能性:

  1. 原始图像是非常大的,和缩略图很小,导致图像质量由简单bilinear interpolation降低。

  2. 由JPEG编码产生的compression artifacts降低了缩略图的质量。

使用一个简单的双线性插值可以足够如果原始图像和缩略图不会被一大堆的大小不同,例如,从200×200 100×100去。但是,当涉及将尺寸较大(例如1600x1200)的图像调整为缩略图尺寸图像,双线性插值(以及双三次插值,就此而言)时,应该使用替代技术,例如多步骤调整大小。

文章The Perils of Image.getScaledInstance()由克里斯·坎贝尔进入约大图片如何以及为什么缩减导致的图像质量下降的更多细节。

Chet Haase和Romain Guy的书Filthy Rich Clients也详细介绍了创建高质量缩略图的一些细节。


我维持称为Thumbnailator缩略图生成库,它采用的技术如多步调整到一个易于使用的API创建高质量的缩略图。

例如,您的示例代码可以使用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