简体   繁体   中英

Generating square thumbnails in Java by cutting (without destroying aspect ratio)?

I'm looking for a way to create a square thumbnail (250px × 250px) in Java without destroying the aspect ratio, that means if the image is rectangular with one side longer than the other it should just cut off whatever doesn't fit in the square. Currently I'm doing this:

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

However, it is not cutting of parts of the image, instead it is squeezing it to fit inside the 250 × 250 square.

You are using getScaledInstance() which will just expand or shrink your image to fit it in the size you are giving it.

Have a look at getSubimage() . You most probably want to first get a sub image which has the same aspect ratio of your target size (a square), then apply getScaledInstance() on it. This way you just shrink with the same aspect ratio and don't get any squeezing effect.

So something like this should work. Assuming you want to keep the middle part when cropping.

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

(I haven't tried it myself, let me know if there are any problems with it.)

You can then pass it to your drawImage() creating the new rendered BufferedImage , and save it to a file.

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()));

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM