В дополнение к замечанию Эрика о getScaledInstance, если вы отошли от него к использованию рекомендованных механизмов масштабирования в Java2D, вы могли заметить, что ваши изображения выглядят заметно хуже.
Причина этого в том, что когда Java2D не рекомендовал использовать getScaledInstance и AreaAveragingScaleFilter, они не заменили его на что-либо столь простое для использования в API, вместо этого мы были оставлены на наших собственных устройствах с использованием Java2D API напрямую. К счастью, Крис Кэмпбелл (из команды J2D) выполнил рекомендацию об использовании метода инкрементального масштабирования, который дает результаты, аналогичные AreaAveragingScaleFilter, и работает быстрее; к сожалению, код имеет приличный размер и не отвечает вашему первоначальному вопросу соблюдения пропорций.
Около 6 месяцев назад я снова и снова видел все эти вопросы на SO о «масштабировании изображений в Java» и в конечном итоге собрал все советы, сделал все исследования и исследования, которые мог, и собрал все в одну «лучшую практику». " библиотека масштабирования изображений .
API очень прост, так как это всего лишь 1 класс и несколько статических методов. Основное использование выглядит так:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 320);
Это самый простой вызов , когда библиотека сделает правильное предположение о качестве, соблюдает пропорции вашего изображения и поместит результат в ограничивающий прямоугольник 320x320. ПРИМЕЧАНИЕ: ограничивающий прямоугольник - это только максимальное используемое значение W / H, так как пропорции вашего изображения соблюдаются, результирующее изображение все равно будет учитывать это, например, 320x200.
Если вы хотите переопределить автоматический режим и заставить его получить лучший результат и даже применить к нему очень мягкий фильтр сглаживания, чтобы он выглядел еще лучше (особенно хорошо для миниатюр), этот вызов будет выглядеть так:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY,
150, 100, Scalr.OP_ANTIALIAS);
Это всего лишь примеры, API является широким и охватывает все: от очень простых вариантов использования до очень специализированных. Вы даже можете передать свои собственные BufferedImageOps, которые будут применены к изображению (и библиотека автоматически исправит 6-летнюю ошибку BufferedImageOp JDK для вас!)
Существует гораздо больше возможностей для успешного масштабирования изображений в Java, чем библиотека делает для вас, например, всегда поддерживая изображение в одном из лучших поддерживаемых типов изображений RGB или ARGB при работе с ним. Под прикрытием конвейер обработки изображений Java2D возвращается к подчиненному программному конвейеру, если тип изображения, используемый для любых операций с изображениями, плохо поддерживается.
Если все это звучало как сильная головная боль, это вроде бы ... вот почему я написал библиотеку и открыл ее из открытых источников, чтобы люди могли просто изменять размеры своих изображений и продолжать жить, не беспокоясь об этом .
Надеюсь, это поможет.