Как получить InputStream из BufferedImage? - PullRequest
41 голосов
/ 16 марта 2009

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

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

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

Спасибо.

Ответы [ 3 ]

81 голосов
/ 04 марта 2011

С http://usna86 -techbits.blogspot.com / 2010/01 / inputtream-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());
10 голосов
/ 16 марта 2009

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

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

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

9 голосов
/ 03 сентября 2012

Переопределив метод 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());
...