Джош,
Это именно то, что я написал imgscalr (Apache 2), чтобы сделать для этого приложения - до сих пор обрабатывается несколько сотен тысяч изображений со всегоо мире и о поврежденных результатах не сообщалось.
Когда я впервые начал изучать масштабирование изображений в Java (для этого проекта), я увидел то, что вы, вероятно, видели, ища здесь ... 200 вопросов, задающих одно и то же, 50 различных способовчтобы сделать это, 25 из них «неправильные», по-видимому, и много головной боли.
Мне действительно нравится решать подобные проблемы, поэтому я сел и собрал все отзывы, все отчеты об ошибках, все советывсе трюки и проблемы, с которыми сталкивались люди, и скомпилировали их в супер-простой 1-класс API , который просто делает «все правильно» для вас.
Самый простойВариант использования API выглядит следующим образом:
BufferedImage scaledImg = Scalr.resize(img, 150);
, но, учитывая, что вы хотите сделать несколько очень маленьких размеров, вы захотите использовать метод масштабирования КАЧЕСТВО, который занятs Крис Кэмпбелл (команда Java2D) рекомендовал метод инкрементального масштабирования И применить к результату заранее определенный ConvolveOp, чтобы немного смягчить миниатюру, потому что она очень мала.
Пример:
BufferedImage img = ImageIO.read(...); // load image
BufferedImage scaledImg = Scalr.resize(img, Method.QUALITY,
50, Scalr.OP_ANTIALIAS);
Вам не нужно указывать оба значения w / h, если вы этого не хотите, пропорции изображения всегда соблюдаются, а границы используются в качестве ограничивающего прямоугольника, чтобы гарантировать, что изображение хотя бы вписывается в него (но никогда не будет нарушать пропорции).изображения для этого).
Если вы когда-либо работали с ConvolveOps, чтобы попытаться смягчить изображение, вы знаете, что найти правильное ядро, достаточно острое, чтобы хорошо выглядеть, но достаточно мягкое, чтобы избавиться отЧерт, ты знаешь, что это королевская PIA - та, что у меня есть предопределенная в библиотеке, является результатом недели сотрудничества с сайтом социальной сети в Бразилии, который использовал библиотеку для масштабирования изображений профиля иЯ думаю, что мы зафиксировали это.
Конечно, вы можете просто использовать это как отправную точку и предоставить свою собственную, тКласс Scalr позволяет вам передавать любой BufferedImageOp, который будет применяться к полученному масштабированному изображению для вас автоматически (И обходить чертову шестилетнюю ошибку JDK, которая приводит к повреждению изображений).
библиотека также предлагает вам множество других «лучших практик» под прикрытием, например, как можно скорее сбрасывать инкрементные изображения, чтобы сократить использование памяти и не перегружать виртуальную машину, всегда сохраняет изображения в наиболее поддерживаемых типах изображений.поэтому программный конвейер в Java2D никогда не используется (вы могли заметить это, когда люди загружают GIF-файлы, если вы используете ручной код, в конечном итоге это выглядит как дерьмо - это исправляет imgscalr) и некоторые другие нюансы, которые соответствуют моему требованию дляБиблиотека "Просто делай все правильно".
Надеюсь, это поможет.