如何在Java中从JPEG创建缩略图?

2022-08-31 22:17:26

有人可以帮忙编写一些代码,用于在Java中创建JPEG的缩略图。

我是新手,所以一步一步的解释将不胜感激。


答案 1
Image img = ImageIO.read(new File("test.jpg")).getScaledInstance(100, 100, BufferedImage.SCALE_SMOOTH);

这将创建一个 100x100 像素的缩略图作为 Image 对象。如果要将其写回磁盘,只需将代码转换为以下内容:

BufferedImage img = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
img.createGraphics().drawImage(ImageIO.read(new File("test.jpg")).getScaledInstance(100, 100, Image.SCALE_SMOOTH),0,0,null);
ImageIO.write(img, "jpg", new File("test_thumb.jpg"));

此外,如果您担心速度问题(如果要缩放许多图像,上述方法相当慢),请使用这些方法和以下声明:

private BufferedImage scale(BufferedImage source,double ratio) {
  int w = (int) (source.getWidth() * ratio);
  int h = (int) (source.getHeight() * ratio);
  BufferedImage bi = getCompatibleImage(w, h);
  Graphics2D g2d = bi.createGraphics();
  double xScale = (double) w / source.getWidth();
  double yScale = (double) h / source.getHeight();
  AffineTransform at = AffineTransform.getScaleInstance(xScale,yScale);
  g2d.drawRenderedImage(source, at);
  g2d.dispose();
  return bi;
}

private BufferedImage getCompatibleImage(int w, int h) {
  GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
  GraphicsDevice gd = ge.getDefaultScreenDevice();
  GraphicsConfiguration gc = gd.getDefaultConfiguration();
  BufferedImage image = gc.createCompatibleImage(w, h);
  return image;
}

然后调用:

BufferedImage scaled = scale(img,0.5);

其中 0.5 是比例比,img 是包含正常大小图像的缓冲图像。


答案 2

正如您可能已经发现的那样,“容易”和“好看的结果”是两件截然不同的事情。我已经将这两个要求封装到一个非常简单的java图像扩展库(Apache 2许可证)中,该库可以为您完成所有正确的操作。

用于创建缩略图的示例代码如下所示:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 150);

您的图像比例是尊重的,库根据缩放(最快,平衡或质量)导致的图像变化量对它应该使用的方法进行最佳猜测,并且始终使用最佳支持的Java2D图像类型进行缩放以避免“黑色”结果或真正可怕的输出(例如,过度抖动的GIF图像)的问题。

此外,如果要强制它输出Java中最好看的缩略图,API调用将如下所示:

BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY, 
                                       150, 100, Scalr.OP_ANTIALIAS);

该库不仅会使用 Java2D 推荐的增量缩放来为您提供最佳外观的结果,它还会对缩略图应用可选的抗锯齿效果(ConvolveOp 具有非常微调的内核),以稍微柔化像素值之间的过渡,从而使缩略图看起来更加均匀,而不是像从非常大的图像到非常小的图像时可能看到的那样清晰或罂粟花。

您可以通读库中的所有注释(代码本身被大量文档化),以查看解决的所有不同的JDK错误或为提高性能或内存使用率而进行的优化。我花了很多时间来调整这个实现,并从在Web应用程序和其他Java项目中部署它的人那里得到了很多很好的反馈。


推荐