Масштабирование и уменьшение размера изображения на сервере - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно уменьшить изображение JPG, чтобы оно уместилось в прямоугольнике 1024x640, и сохранить его так, чтобы его размер не превышал 20 кБ. С некоторым поиском, мне удалось сделать оба. Для масштабирования я использую

private static BufferedImage scale(BufferedImage input, int width, int height) {
    final int type = input.getTransparency() == Transparency.OPAQUE ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
    final BufferedImage result = new BufferedImage(width, height, type);
    final Graphics2D g2 = result.createGraphics();
    g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
    g2.drawImage(input, 0, 0, width, height, null);
    g2.dispose();
    return result;
}

, а для уменьшения размера я использую ImageWriter с JPEGImageWriteParam и повторяю с уменьшенным качеством, пока размер файла не станет ниже предела.

На моем компьютере он работает довольно хорошо, но на тестовом сервере он делает ужасные вещи:

original file size:    174548
scaled down file size:  16995 - on my machine
                       228218 - on the server

Таким образом, уменьшенное изображение больше оригинала, а качество ужасное.

Я думал, что это может быть связано с проблемой безголовых Java , но установка Java не безголовая (и я никогда не получаю HeadlessException):

java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~16.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

Любая идея, чтопроисходит?

Ответы [ 2 ]

0 голосов
/ 26 октября 2019

Проблема заключалась в изменении размера с помощью Graphics2D. Не знаю, почему он сделал то, что сделал, но после замены на java-image-scaling проблема исчезла.

Вполне возможно, что есть лучшие библиотеки, но дляна данный момент это работает достаточно хорошо.

0 голосов
/ 26 октября 2019

Мы использовали ImageMagick для изменения размера изображения и повторного форматирования. Это может дать вам гибкость. Нам удалось использовать его ранее по аналогии с вашей.

ImageMagick использует несколько вычислительных потоков для повышения производительности и может считывать, обрабатывать или записывать мега-, гига- или терапиксельные изображения.

Это бесплатнос открытым исходным кодом. Вы можете обратиться к официальному веб-сайту для получения дополнительной информации: https://imagemagick.org/index.php

Пример программы работает следующим образом:

ConvertCmd cmd = new ConvertCmd();

// create the operation, add images and operators/options
IMOperation op = new IMOperation();
op.addImage("source_picture.jpg"); // source file
op.resize(800,600);
// of op.resize(800); // and height calculate automatically
op.addImage("resized_picture.jpg"); // destination file file

// execute the operation
cmd.run(op);

Проверьте связанный поток stackoverflow Изображение magick java

Надеюсь, это поможет!

...