Java ImageIO IIOException: неподдерживаемый тип изображения?
работа с изображениями в Java в первый раз, и я получаю некоторые странные исключения, которые не очень хорошо документированы. Вот строка кода, которая не работает:
BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));
эта строка бросает исключение IIOException с неподдерживаемый тип изображения как сообщение об исключении. Я проверил и перепроверил, что на самом деле эта строка вызывает исключение, что объект File действителен, что URL действителен и что image.jpg
на самом деле является допустимым JPG, который отлично загружается в других зрителях изображений.
что я могу сделать, чтобы получить больше информации о природе этого исключения? Это традиционный способ загрузки изображений в Java 7 или это старый/устаревший метод? Там просто не так много информации об этих исключениях "неподдерживаемого типа изображения", и, конечно же, ImageIO поддерживает JPGs!
Спасибо за любую помощь!
3 ответов
попробуйте проверить кодировку JPEG. ImageIO
не удается прочитать изображения jpeg в кодировке CMYK, например.
AFAIK, ImageIO не обновлялся годами, поэтому вы хотите попробовать использовать официальную альтернативу / расширение:Джай ImageIO.
Unforutnately, Джай ImageIO должен некоторые собственные библиотеки, установленные в JRE, что может быть нежелательным. Мы делаем следующее:
- использовать Апач Sanselan чтобы определить, является ли это В формате JPEG
- поскольку Sanselan не может читать и писать JPEG, используйте простой старый AWT
JPEGCodec
:JPEGCodec.createJPEGDecoder(...)
- чтобы преобразовать CMYK в RGB, мы получаем растр read
BufferedImage
и вручную преобразовать его (вы можете использовать ICC профили, но ручное преобразование соответствует нашим потребностям)
вот мой вопрос, который привел к тому, что ImageIO
не поддерживает все типы изображений JPEG, и я там заявил немного больше моих выводов о том, почему вы получаете это сообщение: чистая альтернатива Java JAI ImageIO для обнаружения изображений CMYK
к сожалению, я столкнулся с большим количеством стандартных файлов JPEG. ImageIO особенно придирчив и часто отказывается загружать изображения, которые часто загружаются и, по-видимому, отображаются правильно другим программным обеспечением с менее строгими проверками формата файла.
это не очень красиво, но один обходной путь-использовать внутренний декодер JPEG Oracle VM напрямую (com.солнце.изображение.кодек.формате JPEG.JPEGCodec), как кажется, терпеть больше спецификаций отклонения как ImageIO обертка:
BufferedImage img =
JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();
это, конечно, не идеальное решение, так как использование конкретных классов реализации заблокирует вас к определенному поставщику виртуальной машины и может сломаться с более новыми версиями виртуальной машины, но если вы будете использовать программное обеспечение только в контролируемой среде, это может быть лучше, чем никакого решения вообще.
другой вариант-использовать .банку, подготовленные Вернер сайт randelshofer:
http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-java-imageio/ или библиотека Monte Media:http://www.randelshofer.ch/monte/
Это выглядит довольно легко и похоже на использование ImageIO и доступно под лицензией CC.