Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > FileInputStream to BufferedImage


Автор: newinjava 9.5.2011, 11:03
Здраствуйте.

У меня есть файл в котором лежат друг за другом несколько JPG картинок, их место нахождение т.е. Offset(ы) мне известны.
Мне нужно как-то вытянуть с помощью  FileInputStream эти картинки в BufferedImage.
На данный момент я делаю так: создаю FileOutputStream, сохраняю в отдельный файлы те картинки что находятся в исходном файле, а затем уже с помощью ImageIO.read создаю BufferedImage. Но вот проблемма в том что я не хочу создавать файлы, мне надо чтобы весь процес преоброзования прошел в памяти!

Как это реализовать?

Автор: newinjava 9.5.2011, 14:16
Всё уже помогли!

Код

            FileInputStream fis = new FileInputStream(this.file);
            fis.skip(start);
            
            byte[] byteArray = new byte[length];
            fis.read(byteArray);
            
            ByteArrayInputStream bais = new ByteArrayInputStream(byteArray);
            
            fis.close();
            bais.close();
            return ImageIO.read(bais);

Автор: AlexeyVorotnikov 10.5.2011, 10:05
А почему нельзя так:
Код

            FileInputStream fis = new FileInputStream(this.file);
            fis.skip(start);
            return ImageIO.read(fis);

Автор: newinjava 12.5.2011, 12:04
Цитата(AlexeyVorotnikov @  10.5.2011,  10:05 Найти цитируемый пост)
А почему нельзя так:


А потомучто будит лишок прихвачен.

Допустим файл состоит из 3 картинок, каждая по 10 Байт!  smile 

Картинка 1: 
Offset: 0
Lenght: 10

Картинка 2: 
Offset: 10
Lenght: 20

Картинка 3: 
Offset: 20
Lenght: 30

Мне нужно только вторую. Т.Е. Я прыгаю к Offset: 10 fis.skip(10); 
И если я потом сразу сделаю return ImageIO.read(fis); то и третья картинка будит возвращаться. А мне надо только одну.

По этому, то что с byteArray, идеально подходит к моей задаче. 

Автор: AlexeyVorotnikov 12.5.2011, 12:34
Цитата(newinjava @  12.5.2011,  13:04 Найти цитируемый пост)
И если я потом сразу сделаю return ImageIO.read(fis); то и третья картинка будит возвращаться. А мне надо только одну

А вот отсюда поподробнее, пожалуйста. Метод  ImageIO.read возвращает один имидж. Как и почему будет прочитан ещё один?

PS. Если у меня сегодня будет немножко времени, поэкспериментирую.

Автор: newinjava 16.5.2011, 16:46
Цитата(AlexeyVorotnikov @  12.5.2011,  12:34 Найти цитируемый пост)
А вот отсюда поподробнее


Ну дак после того как я прыгнул к оффсету 10 вызывается return ImageIO.read(fis); который читает всё начиная с оффсета 10 и до конца!

А мне надо только кусок от оффсета 10 до оффсета 20

Цитата(newinjava @  12.5.2011,  12:04 Найти цитируемый пост)
По этому, то что с byteArray, идеально подходит к моей задаче.  


Автор: AlexeyVorotnikov 17.5.2011, 12:32
Да, попробовал я сам. Что-то ImageIO.read, то ли, действительно, читает поток до конца, то ли просто глючит. Не получается нормально прочитать несколько изображение последовательно. :(

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)