ImageIO Альтернатива для чтения для InputStream к BufferedImage

У меня есть веб-приложение Spring MVC, написанное на Java, и вы тоже можете загружать изображения. Этими изображениями нужно манипулировать (изменять их размер, обрезать и т. Д.), И для этого я использую библиотеку Scalr, которая требует считывания изображений из BufferedImage.

В Java вы можете очень легко конвертировать из InputStream (как поступают изображения) в BufferedImage:

final BufferedImage img = ImageIO.read(in);

Тем не менее, ImageIO очень привередлив в форматах изображений и создает всевозможные исключения, если что-то не так с изображением. Пользователи могут загружать практически любое качество изображения в веб-приложение, поэтому это неприемлемо.

Поэтому я ищу альтернативу. Я немного погуглил, и одним из предложений было Java Advanced Imaging от Oracle. Единственная проблема заключается в том, что он, похоже, полагается на реализацию Oracle Java, а я этим не пользуюсь.

Есть ли другая библиотека, которую я могу использовать?

1 ответ

Решение

Я бы сказал, пока не меняйте свой код!

Хорошая вещь о библиотеке ImageIO состоит в том, что она полностью основана на плагинах. Если он не читает нужные вам форматы прямо из коробки, вы можете очень легко добавить поддержку.

Я написал пару плагинов для проекта TwelveMonkeys ImageIO (в частности, он включает в себя JPEGImageReader который поддерживает цветовое пространство CMYK).

Вернер Рандельсхофер CMYKJPEGImageReader связанный с @MadProgrammer - еще один плагин, который вы можете попробовать.

JAI, как вы упомянули, также имеет плагины, которые позволяют вам читать файлы CMYK JPEG (я думаю), однако многие плагины требуют собственных библиотек и дополнительной установки, которая может быть проблемой в контексте веб-приложения. Проект также не обновлялся годами.

Я уверен, что есть и коммерческие плагины, но я не исследовал их.

Если вы действительно хотите изменить библиотеку, взгляните на Apache Commons Imaging. Он имеет очень хороший API и поддерживает множество форматов. Изображения читаются в BufferedImages. Однако их поддержка JPEG пока не очень развита, поэтому, скорее всего, она не будет читать ваше изображение.

JMagick и im4java используют ImageMagick, который имеет очень хорошую поддержку для многих форматов. Требуется родная установка IM. Однако API основаны на файлах, что означает, что вам часто приходится записывать свои потоки во временный файл перед обработкой. Также не поддерживает напрямую BufferedImages, но вы можете конвертировать, если хотите, и во многих случаях вы можете использовать IM, встроенные в манипуляции с изображениями вместо Java.

Опять же, могут быть полные альтернативы коммерческой библиотеке, либо на Java, либо на основе собственного кода.

Другие вопросы по тегам