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

16

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

ImageIO.read(new File(filename));

Это работает для большинства файлов, однако для одного я получаю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 b
Нету. Я должен был полагаться на тот факт, что при возникновении этой ошибки будут найдены другие изображения. mtrc
Трудно сказать - природа процесса поиска изображений очень ненаправленная (идея заключается в том, что программное обеспечение является автономным!) Однако оно является единственным с такой низкой насыщенностью. Как вы думаете, в этом причина? mtrc
Я получаю ту же ошибку (по крайней мере, при использованииImageIO.read(new URL("http://i.imgur.com/rC6Jk.jpg"));). Это единственное черно-белое изображение, которое вы обрабатываете? Moritz Petersen

Ваш Ответ

3   ответа
11

Таким образом, у меня возникла та же проблема, и я обнаружил, что изображение было серого и что реализация 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;
            }
        }
Если кому-то интересно, как это получитьstream, если можно создать с помощьюImageIO.createImageInputStream(InputStream) (этот аргумент может бытьFileInputStream, ByteArrayInputStream так далее).
Замечательные вещи! Никогда не думал, что кто-нибудь вернется и сбьет этого, но ты это сделал! Прекрасные вещи. mtrc
Прелесть SO: проблема, на решение которой у меня ушло бы два часа, сейчас занимает 10 минут. Спасибо, Тейт Мур.
Когда я использую это решение после сбоя ImageIO.read (InputStream), он не выполняет остальную часть кода (while (iter.hasNext ()) false), но если я пропускаю часть ImageIO.read (InputStream), это делает работа. Что не так с моим кодом?
+1, потому что он работает на некоторых шкалах серого, не работает с ImageIO.read (...). Но обратите внимание, этот код вызывает загрузку изображения в градациях серого, даже если это не так. Вы должны сначала сделать ImageIO.read (...) & amp; если это не удается, используйте этот метод.
2

используя двенадцать ключей 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>
4

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

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

Похожие вопросы