通过切割(不破坏纵横比)在Java中生成方形缩略图?

Posted

技术标签:

【中文标题】通过切割(不破坏纵横比)在Java中生成方形缩略图?【英文标题】:Generating square thumbnails in Java by cutting (without destroying aspect ratio)? 【发布时间】:2019-04-04 13:57:09 【问题描述】:

我正在寻找一种在不破坏纵横比的情况下在 Java 中创建方形缩略图(250px × 250px)的方法,这意味着如果图像是矩形且一侧比另一侧长,则它应该切断任何没有的东西' t 适合正方形。目前我正在这样做:

public static void createThumbnail(File file, String extension)
        throws IOException 
    BufferedImage img = new BufferedImage(
            250, 250, BufferedImage.TYPE_INT_RGB);
    img.createGraphics().drawImage(
            ImageIO.read(file).getScaledInstance(
                    250, 250, Image.SCALE_SMOOTH), 0, 0, null);
    ImageIO.write(img, extension, new File(
            "./public/images/thumbs/" + file.getName()));

但是,它不是剪切图像的一部分,而是将其压缩以适应 250 × 250 的正方形。

【问题讨论】:

剪掉使其成为矩形的部分,使结果为正方形。然后将其缩小到图标大小。 【参考方案1】:

您正在使用getScaledInstance(),它只会扩大或缩小您的图像以适应您提供的尺寸。

看看getSubimage()。您很可能希望首先获得与目标尺寸(正方形)具有相同纵横比的子图像,然后在其上应用getScaledInstance()。这样一来,您只需以相同的纵横比进行收缩,而不会产生任何挤压效果。

所以这样的事情应该可以工作。假设您想在裁剪时保留中间部分。

Image getThumbnail(File file) 

  BufferedImage original = ImageIO.read(file);
  //assuming we want a square thumbnail here
  int side = Math.min(original.getWidth(), original.getHeight());

  int x = (original.getWidth() - side) / 2;
  int y = (original.getHeight() - side) / 2;

  BufferedImage cropped = original.getSubimage(x, y, side, side);
  return cropped.getScaledInstance(250, 250, Image.SCALE_SMOOTH);

(我自己没试过,如果有问题请告诉我。)

然后,您可以将其传递给您的 drawImage(),创建新呈现的 BufferedImage,并将其保存到文件中。

BufferedImage img = new BufferedImage(250, 250, BufferedImage.TYPE_INT_RGB);
img.createGraphics().drawImage(getThumbnail(file), 0, 0, null);
ImageIO.write(img, extension, new File("./public/images/thumbs/" + file.getName()));

【讨论】:

不要忘记重新采样。 g.setRenderingHint(KEY_INTERPOLATION, VALUE_INTERPOLATION_BICUBIC); 稍微提高了质量。为了获得更好的质量,请使用像 imgscalr 或我自己的 ImageUtilities 这样的重采样库 getScaledInstance 返回的是 Image 而不是 BufferedImage,如何将其写回磁盘? @Klausar 做和以前一样的事情。使用createGraphics().drawImage()将图像渲染成一个新的BufferedImage

以上是关于通过切割(不破坏纵横比)在Java中生成方形缩略图?的主要内容,如果未能解决你的问题,请参考以下文章

保留图像中的纵横比::Magick 的缩略图功能

固定缩略图比例大小和保持纵横比?

PIL:缩略图并以方形图像结尾

使用GD创建保持纵横比的缩略图

使图像适应容器大小保持纵横比

如何在不影响纵横比的情况下将纵向和横向图像显示为网格上的正方形?