ImageIO.createImageInputStream продолжает возвращать значение null

Привет всем! Всякий раз, когда я пытаюсь получить объект ImageInputStream с помощью ImageIO.createImageInputStream, он просто возвращает null без исключений, предупреждений или ошибок. Я пробовал передавать функции разные типы данных, простой File и InputStream, но оба также возвращали null. В документации сказано, что если не будет найдено подходящего ImageInputStreamSpi, то функция вернет null, но файл представляет собой болотный стандартный JPEG, и наверняка Java поставляется с поставщиком услуг для такого формата из коробки? Спасибо за ваше время.

/**
 * Reads in an image from a file and returns the image in a
 * {@code BufferedImage} object.
 *
 * @param source the file to create the {@code BufferedImage}
 * from.
 * @return the {@code BufferedImage} object representing the image
 * in {@code source}.
 */
private BufferedImage readImage( File source ) {
    // There is only one image in this file
    final int imageIndex = 0;
    BufferedImage image = null;

    try {
        // Get the ImageReader object for this filetype
        Iterator readers =
            ImageIO.getImageReaders( source );
        ImageReader reader = (ImageReader) readers.next();

        // Create an ImageInputStream object from the source image file
        ImageInputStream iis = ImageIO.createImageInputStream( source );
        // Raises IllegalArgumentException, because iis is null
        reader.setInput( iis, true );

        // Read the image file
        image = reader.read( imageIndex );
    } catch ( Exception exception ) {
        exception.printStackTrace();
        System.exit( -1 );
    }

    return image;
}

person Sean Kelleher    schedule 26.02.2011    source источник
comment
хорошо очистите свой код и опубликуйте его здесь, чтобы мы могли помочь :)   -  person FearUs    schedule 27.02.2011
comment
За исключением того, что вы не ответили на мой вопрос, вы просто дали мне другое решение, которое я уже использовал раньше, как подробно описано ниже... Мой первоначальный вопрос, с которым у меня все еще возникают проблемы, все еще остается без ответа...   -  person Sean Kelleher    schedule 27.02.2011
comment
У меня точно такая же проблема. По какой-то причине он работает на MacOSX 1.6 из Eclipse, но не работает в рабочей среде, которая является средой Debian Linux. Мое приложение представляет собой веб-приложение на основе OSGI, построенное на контейнере сервлетов Equinox и Jetty. из всего, что я читал до сих пор, похоже, что это связано с JAI и OSGI (stackoverflow.com/questions/1493199/ бег-джай-ин-осги). Но я еще не решил ее.   -  person Christoph    schedule 08.07.2012


Ответы (1)


Зачем ты все это делаешь?? вы можете просто сделать это:

image = ImageIO.read(source);

Нет Iterators, ImageInputStreams... нет ничего!

EDIT: поскольку вы настаиваете, ваш код не работает, потому что вы отправляете File в ImageIO.getImageReaders() вместо ImageInputStream. SO ваш код должен выглядеть примерно так:

ImageInputStream iis = ImageIO.createImageInputStream(source);
Iterator readers = ImageIO.getImageReaders(iis);
ImageReader reader = (ImageReader) readers.next();

reader.setInput(iis, false);
image = reader.read(imageIndex);
person FearUs    schedule 27.02.2011
comment
Первоначально я использовал ImageIO.read, но для больших файлов, вместо того, чтобы просто останавливаться при чтении большого изображения, я хотел добавить функциональность для добавления наблюдателей к моему ImageReader, чтобы отслеживать, какая часть файла была прочитана. - person Sean Kelleher; 27.02.2011
comment
Хорошо, я отредактировал свой код так, как вы описали, но та же проблема все еще сохраняется; ImageIO.createImageInputStream просто возвращает null вместо действительного ImageInputStream, так что это вызывает IllegalArgumentException в ImageIO.getImageReaders вместо ImageReader::setInput. - person Sean Kelleher; 28.02.2011
comment
В Javadocs ImageIO.createImageInputStream(Object input) говорится, что ввод должен быть объектом, который будет использоваться в качестве источника ввода, например, файл, читаемый RandomAccessFile или InputStream. Этот метод выдает IllegalArgumentException, если введено значение null! Поэтому убедитесь, что вы не передаете null в параметре source. - person FearUs; 28.02.2011
comment
Это моя проблема, параметр source определенно не null, это изображение File, но ImageIO.createImageInputStream по-прежнему молча возвращает null без каких-либо исключений, это любые функции, которые впоследствии пытаются использовать ImageInputStream, которые вызывают исключение. В исходном вопросе я изложил, как документация объясняет, как ImageIO.createImageInputStream возвращает null. Спасибо за вашу помощь. - person Sean Kelleher; 28.02.2011