ImageIO.read исключение недопустимого аргумента - растровые полосы / компоненты цветового пространства?

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

<code>ImageIO.read(new File(filename));
</code>

Это работает для большинства файлов, однако для одного я получаюIllegalArgumentException with the detail: "numbers of source Raster bands and source color space components do not match", Это изображение было получено с помощью wget по действительному URL-адресу Flickr, и я использовал другие изображения, полученные таким образом, поэтому способ получения изображений в принципе кажется надежным. Я не уверен, что является причиной исключения.

Обходной путь был бы более чем приемлемым - я не возражаю против использованияImageIO в частности, и изображение выглядит хорошо визуально. Мне просто нужно, чтобы его читали без сумасшествия с Java!

Вот изображение, о котором идет речь, в случае его использования:

enter image description here

 matt b21 июн. 2012 г., 20:46
Вы нашли какое-нибудь решение для этого?
 Moritz Petersen02 мая 2012 г., 17:12
Я получаю ту же ошибку (по крайней мере, при использованииImageIO.read(new URL("http://i.imgur.com/rC6Jk.jpg"));). Это единственное черно-белое изображение, которое вы обрабатываете?
 mtrc02 мая 2012 г., 17:25
Трудно сказать - природа процесса поиска изображений очень ненаправленная (идея заключается в том, что программное обеспечение является автономным!) Однако оно является единственным с такой низкой насыщенностью. Как вы думаете, в этом причина?
 mtrc22 июн. 2012 г., 22:37
Нету. Я должен был полагаться на тот факт, что при возникновении этой ошибки будут найдены другие изображения.

Ответы на вопрос(3)

Решение Вопроса

Таким образом, у меня возникла та же проблема, и я обнаружил, что изображение было серого и что реализация ImageIO.read по умолчанию не понимала этого, потому что метаданные изображения были не такими, как ожидалось. Я написал работу, которая повторяет загрузку, как & quot; BufferedImage.TYPE_BYTE_GRAY & apos; если это не удается основной нагрузки.

            Iterator<ImageReader> iter = ImageIO.getImageReaders(stream);

        Exception lastException = null;
        while (iter.hasNext()) {
            ImageReader reader = null;
            try {
                reader = (ImageReader)iter.next();
                ImageReadParam param = reader.getDefaultReadParam();
                reader.setInput(stream, true, true);
                Iterator<ImageTypeSpecifier> imageTypes = reader.getImageTypes(0);
                while (imageTypes.hasNext()) {
                    ImageTypeSpecifier imageTypeSpecifier = imageTypes.next();
                    int bufferedImageType = imageTypeSpecifier.getBufferedImageType();
                    if (bufferedImageType == BufferedImage.TYPE_BYTE_GRAY) {
                        param.setDestinationType(imageTypeSpecifier);
                        break;
                    }
                }
                bufferedImage = reader.read(0, param);
                if (null != bufferedImage) break;
            } catch (Exception e) {
                lastException = e;
            } finally {
                if (null != reader) reader.dispose();               
            }
        }
        // If you don't have an image at the end of all readers
        if (null == bufferedImage) {
            if (null != lastException) {
                throw lastException;
            }
        }
 18 февр. 2016 г., 19:45
Если кому-то интересно, как это получитьstream, если можно создать с помощьюImageIO.createImageInputStream(InputStream) (этот аргумент может бытьFileInputStream, ByteArrayInputStream так далее).
 24 июл. 2012 г., 01:08
Прелесть SO: проблема, на решение которой у меня ушло бы два часа, сейчас занимает 10 минут. Спасибо, Тейт Мур.
 18 февр. 2015 г., 08:08
+1, потому что он работает на некоторых шкалах серого, не работает с ImageIO.read (...). Но обратите внимание, этот код вызывает загрузку изображения в градациях серого, даже если это не так. Вы должны сначала сделать ImageIO.read (...) & amp; если это не удается, используйте этот метод.
 mtrc27 июл. 2012 г., 21:03
Замечательные вещи! Никогда не думал, что кто-нибудь вернется и сбьет этого, но ты это сделал! Прекрасные вещи.
 28 авг. 2012 г., 22:45
Когда я использую это решение после сбоя ImageIO.read (InputStream), он не выполняет остальную часть кода (while (iter.hasNext ()) false), но если я пропускаю часть ImageIO.read (InputStream), это делает работа. Что не так с моим кодом?

используя двенадцать ключей ImageIO, которые являются более надежной и прощающей заменой оригинального ImageIO, предоставленного JRE.

Увидетьhttps://github.com/haraldk/TwelveMonkeys/

Я нашел это решение в PDF Box Jirahttps://issues.apache.org/jira/browse/PDFBOX-3637

Чтобы использовать двенадцать обезьян, достаточно добавить его как зависимость maven. Затем он регистрируется перед обработчиком изображений по умолчанию.

<dependency>
    <groupId>com.twelvemonkeys.imageio</groupId>
    <artifactId>imageio-jpeg</artifactId>
    <version>3.3.2</version> <!-- Alternatively, build your own version -->
</dependency>

что количество растровых полос, как указано в цветовом профиле ICC, кажется неправильным. я использовалImageMagick убрать профиль ICC с картинки. ImageIO впоследствии не имеет проблем с чтением изображений (~ 1 тыс. Плохих изображений). Надеюсь, это поможет.

 mtrc07 апр. 2013 г., 14:53
Это сделал! Благодарю. Я определенно считаю, что сообщение является информативным, оно чуть выше моего уровня понимания, а не их вина. Спасибо за комментарий :)

Ваш ответ на вопрос