通过切割(不破坏纵横比)生成 Java 的方形缩略图?
Generating square thumbnails in Java by cutting (without destroying aspect ratio)?
我正在寻找一种在 Java 中创建正方形缩略图 (250px × 250px) 而不破坏纵横比的方法,这意味着如果图像是一侧长于另一侧的矩形,它应该只是切断任何不适合正方形的东西。目前我正在这样做:
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 的正方形。
您正在使用 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()));
我正在寻找一种在 Java 中创建正方形缩略图 (250px × 250px) 而不破坏纵横比的方法,这意味着如果图像是一侧长于另一侧的矩形,它应该只是切断任何不适合正方形的东西。目前我正在这样做:
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 的正方形。
您正在使用 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()));