2009-03-16 4 views
35

Как я могу получить InputStream из объекта BufferedImage? Я попытался это, но ImageIO.createImageInputStream() всегда возвращает NULLКак получить InputStream из BufferedImage?

BufferedImage bigImage = GraphicsUtilities.createThumbnail(ImageIO.read(file), 300); 
ImageInputStream bigInputStream = ImageIO.createImageInputStream(bigImage); 

миниатюра изображения быть правильно генерируется, так как я могу рисовать bigImage к JPanel с успехом.

спасибо.

ответ

10

Если вы пытаетесь сохранить изображение в файл попробуйте:

ImageIO.write(thumb, "jpeg", new File(....)); 

Если вы просто хотите в байтах попробовать делать вызов записи, но передать его ByteArrayOutputStream, который вы можете получить массив байтов из и делать с ним то, что вы хотите.

+1

Спасибо, написав ByteArrayOutputStream, а затем преобразовывая его в ByteArrayInputStream, выполнил эту работу. Но мне интересно, почему ImageIO.createImageInputStream() не работает. – fromvega

+0

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

+0

Я пытаюсь загрузить образ на сервер, поэтому я хочу создать InputStream. – fromvega

72

От http://usna86-techbits.blogspot.com/2010/01/inputstream-from-url-bufferedimage.html

Это работает очень хорошо!

Вот как вы можете сделать InputStream для BufferedImage:

URL url = new URL("http://www.google.com/intl/en_ALL/images/logo.gif"); 
BufferedImage image = ImageIO.read(url); 
ByteArrayOutputStream os = new ByteArrayOutputStream(); 
ImageIO.write(image, "gif", os); 
InputStream is = new ByteArrayInputStream(os.toByteArray()); 
+2

работал для меня correctlt :) спасибо. –

+0

Фелипе. Я пытался найти тип (gif, png, jpg и т. Д.) Изображения, полученного из URL без расширения. Я нашел для него работу, но когда вы пишете изображение во входной поток ImageIO.write (изображение, 'gif', os); вы уже упоминали тип изображения, как я могу это сделать без указания типа изображения. – WowBow

+0

Вы должны указать тип. Наверное, это не то же самое, что и вход. Вы можете читать PNG и записывать в формате JPEG. –

9

Переопределелив метод toByteArray(), возвращая сам buf (не копировать), вы можете избежать проблем, связанных с памятью. Это будет разделять один и тот же массив, не создавая другого правильного размера. Важно использовать метод size(), чтобы контролировать количество действительных байтов в массиве.

final ByteArrayOutputStream output = new ByteArrayOutputStream() { 
    @Override 
    public synchronized byte[] toByteArray() { 
     return this.buf; 
    } 
}; 
ImageIO.write(image, "png", output); 
return new ByteArrayInputStream(output.toByteArray(), 0, output.size()); 
+0

Выполнение этого и использование 'IOUtils.copy (is, output)' 'buf' приводит к двойному размеру. Так что это очень плохой подход. Я должен спуститься вниз, но я больше не могу. – Davidea

Смежные вопросы