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.