Java ImageIO IIOException: неподдерживаемый тип изображения? - PullRequest
27 голосов
/ 24 августа 2011

Работа с изображениями в Java впервые, и я получаю некоторые странные исключения, которые не очень хорошо документированы. Вот строка кода, которая терпит неудачу:

BufferedImage imgSelected = ImageIO.read(new File("/abs/url/to/file/image.jpg"));

В этой строке выдается исключение IIOException с Неподдерживаемый тип изображения в качестве сообщения об исключении. Я проверил и перепроверил, что именно эта строка выдает исключение, что объект File действителен, что URL действителен, и что image.jpg на самом деле является допустимым JPG, который прекрасно загружается в другом изображении зрители.

Что я мог сделать, чтобы получить больше информации о природе этого исключения? Это традиционный способ загрузки изображений в Java 7, или это старый / устаревший метод? Об этих исключениях типа «Неподдерживаемый тип изображения» не так много информации, и, конечно, ImageIO поддерживает JPG!

Спасибо за любую помощь!

Ответы [ 3 ]

32 голосов
/ 24 августа 2011

Попробуйте проверить кодировку JPEG. Например, ImageIO не может читать изображения JPEG в кодировке CMYK. AFAIK, ImageIO не обновлялся годами, поэтому вы хотели бы попробовать и использовать официальную альтернативу / расширение: JAI ImageIO .

К сожалению, JAI ImageIO необходимо установить некоторые собственные библиотеки в JRE, что может быть нежелательным. Мы делаем следующее:

  • используйте Apache Sanselan , чтобы определить, является ли это JPEG
  • , поскольку Sanselan не может читать и записывать JPEG, используйте обычный старый AWT JPEGCodec: JPEGCodec.createJPEGDecoder(...)
  • для преобразования CMYK в RGB, мы получаем растр чтения BufferedImage и вручную конвертируем его (вы можете использовать профили ICC, но ручное преобразование соответствует нашим потребностям)

Вот мой вопрос, который возник из-за того, что ImageIO не поддерживает все типы изображений JPEG, и я там изложил немного больше моих выводов о том, почему вы получаете это сообщение: Альтернатива Pure Java в JAI ImageIO для обнаружения изображений CMYK

11 голосов
/ 24 августа 2011

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

Это не очень красиво, но один из способов - использовать OracleВстроенный в JPEG внутренний декодер JPEG (com.sun.image.codec.jpeg.JPEGCodec), так как он, как представляется, допускает больше спецификационных отклонений в качестве оболочки ImageIO:

BufferedImage img = 
    JPEGCodec.createJPEGDecoder(inputStream).decodeAsBufferedImage();

Это, конечно, не идеальное решение,поскольку использование классов, специфичных для реализации, заблокирует вас для конкретного поставщика ВМ и может порвать с более новыми версиями ВМ, но если вы будете использовать программное обеспечение только в контролируемой среде, это может оказаться лучше, чем отсутствие решения вообще.

1 голос
/ 27 августа 2014

Другой вариант - использовать .jar, приготовленный Вернером Ранделсхофером:

http://www.randelshofer.ch/blog/2011/08/reading-cmyk-jpeg-images-with-java-imageio/ или Медиатека Монте: http://www.randelshofer.ch/monte/

Это выглядит довольно просто и похоже на использование ImageIO и доступно по лицензии CC.

...