Мне нужно уменьшить изображение 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)
Любая идея, чтопроисходит?