使用Java从高质量图像中获取低质量缩略图

时间:2011-07-23 16:47:49

标签: java image thumbnails resolution

我已尝试使用以下代码生成高质量的缩略图,但拇指指甲模糊不清晰。

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;
}

原始图像是高质量图像。为什么我的缩略图失真且质量低?

1 个答案:

答案 0 :(得分:10)

查看代码有两种可能性:

  1. 原始图像非常大,缩略图非常小,导致图像质量因简单bilinear interpolation而降低。

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

  3. 如果原始图像和缩略图的大小差别不大,使用简单的双线性插值就足够了,例如,从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);