Java - Как дополнить и изменить размер изображения без обрезки? - PullRequest
0 голосов
/ 09 декабря 2018

Мне нужно изменить размер множества изображений с соотношением сторон (2: 3) до (3: 4).

В настоящее время изображения имеют размер 800 x 1200 пикселей.Мне нужно, чтобы они были размером 600px x 800px, в конце концов, без обрезки.

Могу ли я узнать, какие библиотеки доступны для меня для заполнения и изменения размера без обрезки в Java?

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Я думаю, что ffmpeg может помочь вам сделать что-нибудь с изображением.например, Используйте ffmpeg для изменения размера изображения

  1. Вы можете хранить двоичные файлы ffmpeg в некоторой папке conf.
  2. Создать скрипт sh для команды ffmpeg.
  3. Используйте CommandLine из (библиотека Apache Commons exec) для запуска сценария.
0 голосов
/ 11 декабря 2018

Удалось сделать это, используя следующий код: 'w' - это количество отступов, которое вам нужно с каждой стороны.

BufferedImage newImage = new BufferedImage(image.getWidth()+2*w, image.getHeight(), 
image.getType());

Graphics g = newImage.getGraphics();

g.setColor(Color.white);
g.fillRect(0,0,image.getWidth()+2*w,image.getHeight());
g.drawImage(image, w, 0, null);
g.dispose();
0 голосов
/ 09 декабря 2018

Из вашего текущего изображения (при условии java.awt.Image) вы можете использовать:

И эти шаги:

  • вычисляют отношения в width и height
  • в зависимости от ихзначения (ширина отступа или высота отступа)
    • вычисляют width и height для получения масштабированного изображения
    • вычисляют требуемое заполнение
  • написать изображение в хорошем положении
static BufferedImage pad(BufferedImage image, double width, double height, Color pad) {
    double ratioW = image.getWidth() / width;
    double ratioH = image.getHeight() / height;
    double newWidth = width, newHeight = height;
    int fitW = 0, fitH = 0;
    BufferedImage resultImage;
    Image resize;

    //padding width
    if (ratioW < ratioH) {
        newWidth = image.getWidth() / ratioH;
        newHeight = image.getHeight() / ratioH;
        fitW = (int) ((width - newWidth) / 2.0);

    }//padding height
    else if (ratioH < ratioW) {
        newWidth = image.getWidth() / ratioW;
        newHeight = image.getHeight() / ratioW;
        fitH = (int) ((height - newHeight) / 2.0);
    }

    resize = image.getScaledInstance((int) newWidth, (int) newHeight, Image.SCALE_SMOOTH);
    resultImage = new BufferedImage((int) width, (int) height, image.getType());
    Graphics g = resultImage.getGraphics();
    g.setColor(pad);
    g.fillRect(0, 0, (int) width, (int) height);
    g.drawImage(resize, fitW, fitH, null);
    g.dispose();

    return resultImage;
}

Использовать как

BufferedImage image = ...;
BufferedImage result = pad(image, 600, 800, Color.white);
...