我已经尝试过下面的代码来生成高质量的缩略图,但是拇指指甲变得模糊不清了。
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;
}
原始图像是高质量的图像。为什么我的缩略图失真并且质量低下?
查看代码有两种可能性:
原始图像很大,缩略图很小,导致图像质量由于简单的bilinear interpolation而降低。
由JPEG编码产生的compression artifacts降低了缩略图的质量。
如果原始图像和缩略图的尺寸相差不大,例如从200x200到100x100,使用简单的双线性插值就足够了。
但是,当要将大尺寸(例如1600x1200)的图像调整为缩略图尺寸时,请使用双线性插值(和双三次插值),因此应使用替代技术,例如多步调整大小。 >克里斯·坎贝尔(Chris Campbell)的
文章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);
@ coolbird