Вы используете 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()));