【问题标题】:Getting low quality thumbnail from a high quality image in Java从 Java 中的高质量图像中获取低质量缩略图
【发布时间】:2011-10-11 17:24:03
【问题描述】:

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

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

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

【问题讨论】:

  • 伙计们,我现在已经获得了清晰度,因为我使用的是 rectina eye 显示器,因此像素大小必须更大才能获得清晰度。例如:70*70 必须是 210*210,这样你才能清楚。

标签: java image thumbnails resolution


【解决方案1】:

看代码有两种可能:

  1. 原图很大,缩略图很小,导致图片质量被简单的bilinear interpolation拉低。

  2. 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);

【讨论】:

    【解决方案2】:

    Thumbnails4j(我是维护者,但它归 Elastic 所有)是一个 java 库,可用于从图像文件以及其他文件类型创建缩略图。

    File input = new File("/path/to/my_file.jpeg");
    Thumbnailer thumbnailer = new ImageThumbnailer("png"); // or "jpg", whichever output format you want
    List<Dimensions> outputDimensions = Collections.singletonList(new Dimensions(100, 100));
    BufferedImage output = thumbnailer.getThumbnails(input, outputDimensions).get(0);
    

    其中一种方法是迭代地调整图像大小,而不是直接跳到所需大小,因为这有助于保持图像质量。但是这个库可以让你不必担心图像处理算法的细节。

    【讨论】:

      猜你喜欢
      • 2011-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-09
      • 1970-01-01
      • 2014-04-07
      • 1970-01-01
      相关资源
      最近更新 更多