Генерация квадратных миниатюр в Java путем вырезания (без разрушения пропорций)? - PullRequest
0 голосов
/ 31 октября 2018

Я ищу способ создания квадратного эскиза (250px × 250px) в Java без разрушения соотношения сторон, это означает, что если изображение прямоугольное с одной стороной длиннее другой, оно должно просто обрезать все, что не не вписывается в площадь. В настоящее время я делаю это:

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 голосов
/ 31 октября 2018

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