Добавляя к точке зрения Erik о getScaledInstance, если вы перешли от нее к использованию рекомендуемых механизмов масштабирования в Java2D, возможно, вы заметили, что ваши изображения выглядят значительно хуже.
Причиной этого является, когда Java2D рекомендуется использовать getScaledInstance и AreaAveragingScaleFilter, они не заменили его с чем-нибудь , как легко использовать в API, вместо того, чтобы мы оставили нашим собственным устройствам с помощью Java2D API, непосредственно. К счастью, Крис Кэмпбелл (из команды J2D) следил за рекомендацией использовать инкрементный метод масштабирования, который дает похожие результаты для AreaAveragingScaleFilter и работает быстрее; к сожалению, код имеет приличный размер и не затрагивает ваш первоначальный вопрос о соблюдении пропорций.
Около 6 месяцев назад я снова и снова повторял все эти вопросы о «масштабировании изображений на Java» и, в конце концов, собрал все советы, сделал все необходимые исследования и исследования и скомпилировал все в один «лучший» практики "image scaling library.
API прост, так как он всего лишь 1 класс и множество статических методов.Основное использование выглядит следующим образом:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, 320);
Это simplest call где библиотека сделает лучше предугадывать по качеству, чтить свои пропорции изображения, и установите результат в поле на 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-летнюю ошибку BufferImageOp JDK!)
Существует гораздо больше возможностей для масштабирования изображений в Java, для вас, например, всегда сохраняя изображение в одном из лучших поддерживаемых типов изображений RGB или ARGB во время работы на нем. Под защитой конвейер обработки изображений Java2D возвращается к более низкому программному конвейеру, если тип изображения, используемый для любых операций с изображениями, плохо поддерживается.
Если все это звучит как большая головная боль, это своего рода ... вот почему я написал библиотеку и открыл ее, поэтому люди могли просто изменять размеры своих изображений и продолжать свою жизнь, не беспокоясь о Это.
Надеюсь, что помогает.
да его GetHeight неправильно опечатка есть какие-либо причине я не могу использовать getScaledInstance с BufferdImage? – user63898
Это должно быть хорошо, потому что BufferedImage extends Image – Max
Hah, спасибо за это первое уравнение. Сделал что-то щелчком в моем запутанном мозгу! – Cameron