Java — чтение в образе (IIOException: невозможно создать ImageInputStream)

Я пишу простую игру, используя дизайн, управляемый данными, в котором я читаю изображения для различных элементов игры. Поэтому я написал синтаксический анализатор для чтения файлов, подтверждения того, что они являются приемлемым форматом изображения, и создания нового спрайта (класс, который я написал) с использованием файлов.

Я читаю файлы с помощью ImageIO.read(), как показано в примере ниже.

toAdd = new Sprite(ImageIO.read(targetFile));

Трассировка стека для исключения выглядит следующим образом:

javax.imageio.IIOException: Can't create an ImageInputStream!
    at javax.imageio.ImageIO.read(ImageIO.java:1280)
    at edu.moravian.utilities.dataParsers.GraphicsDataParser.readInSprites(GraphicsDataParser.java:53)

Я понятия не имею, что вызывает это. Приложение не является многопоточным, изображения находятся в правильном каталоге и существование подтверждено, и у меня есть разрешения, необходимые для доступа к изображениям.

Что я могу упустить?


person Myles Barros    schedule 05.03.2013    source источник
comment
Вы пытались открыть файл с помощью обычного потока ввода? И существует ли он?   -  person Jens Egholm    schedule 05.03.2013
comment
Я добавил в код проверку, подтверждающую существование файлов. Как бы вы порекомендовали открывать изображения с помощью обычного входного потока? Основная привлекательность простого использования ImageIO.read() заключалась в том, что мне не нужно было напрямую использовать входные потоки.   -  person Myles Barros    schedule 05.03.2013
comment
Действительно - и это был бы мой выбор. Бит ImageIO очень высокоуровневый (как и ваше сообщение об ошибке, на самом деле), поэтому просмотр более простого InputStream может дать вам понять, что происходит не так. В таком случае я бы, вероятно, просто попытался открыть файл и просмотреть его содержимое, чтобы увидеть, не пойдет ли что-то не так (дисковый ввод-вывод, разрешения и т. д.). Еще одна вещь, которую нужно сделать, это использовать статический ресурс, который, как вы знаете, будет работать, и брать его оттуда. Извините, я больше не могу подсказать - я никогда не сталкивался с такими ошибками.   -  person Jens Egholm    schedule 06.03.2013
comment
Но если ничего не помогает, возможно, вы можете добавить еще немного кода, чтобы объяснить, как и где происходит сбой? Как выглядит targetFile, например?   -  person Jens Egholm    schedule 06.03.2013
comment
TargetFile в моем тестовом примере — это простой PNG, который я использовал и успешно считывал в отдельном проекте аналогичным образом. Я попробовал несколько других изображений, таких как пара JPG и другой PNG, и ошибка повторяется. Хотя я не знаю, насколько это может быть актуально, я временно использую абсолютный путь к файлу для каталога изображений, из которого я читаю, поскольку мне не удалось распознать каталог ни в одной из обычных локальных папок. Тем временем я попытаюсь изучить использование InputStream более непосредственно. Большое спасибо за вашу помощь, я очень ценю это.   -  person Myles Barros    schedule 06.03.2013
comment
Ну, я чувствую себя глупо. Вместо того, чтобы передавать нужный файл напрямую, я попытался найти ленивое решение: я обернул его как FileInputStream и передал его на свое место, и он работал очень хорошо - зеленые тесты по всем направлениям. Спасибо за предложение. Немного обидно не знать, в чем была основная причина, но я рад, что код хотя бы работает.   -  person Myles Barros    schedule 06.03.2013
comment
Рад помочь :-) И хорошо, что вы разобрались. Думаю, это темная сторона высокоуровневого API для вас...   -  person Jens Egholm    schedule 06.03.2013


Ответы (1)


Одной из возможных причин может быть то, что вы читаете файл jpeg, в котором используется цветовая модель CMYK. ImageIO не поддерживает их по умолчанию.

Однако есть возможность добавить эту функцию. Например, посмотрите на этот ответ: https://stackoverflow.com/a/16149142/6276704

person BluE    schedule 11.10.2017