Добавление некоторой уточняющей информации здесь.
Нет, это не лучший способ получить хорошо выглядящее масштабированное изображение в Java. Использование getScaledInstance и лежащего в основе AreaAveragingScaleFilter не рекомендуется командой Java2D в пользу некоторых более продвинутых методов.
Если вы просто пытаетесь получить симпатичный эскиз, используйте метод Криса Кэмпбелла, предложенный Дэвидом. Что бы это ни стоило, я реализовал этот алгоритм вместе с 2 другими более быстрыми методами в библиотеке масштабирования изображений Java под названием imgscalr (лицензия Apache 2). Задача библиотеки заключалась в том, чтобы конкретно решить этот вопрос в хорошо настроенной библиотеке, которая проста в использовании:
BufferedImage thumbnail = Scalr.resize(srcImg, 150);
Чтобы получить наилучший из возможных масштабированных экземпляров в Java, вызов метода должен выглядеть примерно так:
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY,
150, 100, Scalr.OP_ANTIALIAS);
Библиотека будет масштабировать исходное изображение с использованием подхода инкрементного масштабирования, рекомендованного командой Java2D, а затем, чтобы сделать его еще более приятным, к изображению применяется очень мягкий вогнутый элемент, эффективно слегка сглаживая его. Это действительно хорошо для маленьких миниатюр, не так важно для огромных изображений.
Если вы раньше не работали с convolveops, то МНОГО работы - просто заставить ядро выглядеть идеально, чтобы опера выглядела хорошо во всех случаях использования. Константа OP, определенная в классе Scalr, является результатом недели сотрудничества с сайтом социальной сети в Бразилии, который развернул imgscalr для обработки изображений профиля для своих участников. Мы ходили взад и вперед и пробовали что-то вроде 10 разных ядер, пока не нашли достаточно тонкое, чтобы изображение не было мягким или нечетким, но все же сглаживало переходы между значениями пикселей, чтобы изображение не выглядело «резким» и шумным в небольших размерах.
Если вы хотите, чтобы лучше всего выглядело масштабированное изображение независимо от скорости, воспользуйтесь предложением Джухи использовать библиотеку java-image-scaling. Это очень обширная коллекция Java2D Ops, включающая поддержку алгоритма Lanczsos , который обеспечит вам наилучший результат.
Я бы держался подальше от JAI не потому, что это плохо, а потому, что это просто другой / более широкий инструмент, чем то, что вы пытаетесь решить. Любой из предыдущих трех упомянутых подходов даст вам великолепно выглядящие миниатюры без необходимости добавлять в свой проект совершенно новую платформу обработки изображений с меньшим количеством строк кода.