我已尝试使用以下代码生成高质量的缩略图,但拇指指甲模糊不清晰。
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 :(得分:10)
查看代码有两种可能性:
原始图像非常大,缩略图非常小,导致图像质量因简单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);