How to convert BufferedImage to InputStream?

40,401

Solution 1

You need to save the BufferedImage to a ByteArrayOutputStream using the ImageIO class, then create a ByteArrayInputStream from toByteArray().

Solution 2

BufferedImageByteArrayOutputStreambyte[]ByteArrayInputStream

Use the ImageIO.write method to make a BufferedImage (which is a RenderedImage) into a ByteArrayOutputStream. From there get a byte array (byte[]), feeding that into an InputStream of type ByteArrayInputStream.

ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageIO.write(buffImage, "jpeg", os);                          // Passing: ​(RenderedImage im, String formatName, OutputStream output)
InputStream is = new ByteArrayInputStream(os.toByteArray());

Both the ByteArrayOutputStream and InputStream implement AutoCloseable. So you can conveniently have those closed automatically by using try-with-resources syntax.

Solution 3

First of all you must get your "bytes":

byte[] buffer = ((DataBufferByte)(bufferedImage).getRaster().getDataBuffer()).getData();

And then use ByteArrayInputStream(byte[] buf) constructor to create your InputStream;

Solution 4

By overriding the method toByteArray(), returning the buf itself (not copying), you can avoid memory related problems. This will share the same array, and not creating another of the correct size. The important thing is to use the size() method in order to control the number of valid bytes into the array.

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());
Share:
40,401

Related videos on Youtube

Sorter
Author by

Sorter

Have 8 years of experience in Desktop, mobile and web development with MS in software engineering. I strive to provide better answers to existing question. If you are looking forward to building a desktop/mobile/web app. You should look into Metamug. I can help you with software development and provide a free consultation. Contact me with a tiny donation.

Updated on October 27, 2020

Comments

  • Sorter
    Sorter about 2 years

    I am uploading images using servlet. To perform resize operations i am converting InputStream to BufferedImage. Now i want to save it in mongoDB. Since, i am new to mongoDB as far as i know, GridFS takes InputStream.

    So, is there any way to convert BufferedImage to InputStream?

  • djechlin
    djechlin over 8 years
    Why is this necessary? Doesn't this load an extra (large) byte array into memory?
  • Möoz
    Möoz about 8 years
    Tried this, got a compile error on the third line: "The method ByteArrayInputStream(byte[]) is undefined for the type" What does that mean?
  • Sorter
    Sorter about 8 years
    Have you made the import correctly. The constructor is correct. docs.oracle.com/javase/7/docs/api/java/io/…
  • morpheus
    morpheus over 6 years
    +1. and this method copies the data not once but twice! once when writing to ByteArrayOutputStream and then again by converting it into a byte array when toByteArray() is called.
  • Nicofisi
    Nicofisi about 5 years
    Doesn't anything need to be closed anywhere? I'm not asking to be mean, I simply dont know ;)
  • Sorter
    Sorter about 5 years
    Let your IDE do that for you.
  • Sorter
    Sorter about 4 years
    You can find the code below
  • Basil Bourque
    Basil Bourque about 3 years
    @Nicofisi Both ByteArrayOutputStream & InputStream implement AutoCloseable. So you can use try-with-resources syntax to conveniently and automatically close those resources whether or not exceptions are thrown.
  • Nikita Kobtsev 9 months
    It's funny that this code snippet works much more efficiently than the approved one, although not as elegant
  • Nikita Kobtsev 9 months
    But it is worth noting that this will only work with images where byte[] is used to represent each pixel

Related