通过剪切在Java中生成方形缩略图(不破坏宽高比)?

时间:2018-10-31 11:51:53

标签: java image thumbnails

我正在寻找一种在Java中创建正方形缩略图(250像素×250像素)而又不破坏宽高比的方法,这意味着,如果图像是矩形,且其一侧比另一侧长,则应将其剪掉。适合在广场上。目前,我正在这样做:

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 个答案:

答案 0 :(得分:2)

您正在使用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()));