How to convert BufferedImage to InputStream?
Solution 1
You need to save the BufferedImage to a ByteArrayOutputStream
using the ImageIO
class, then create a ByteArrayInputStream
from toByteArray()
.
Solution 2
BufferedImage
➙ ByteArrayOutputStream
➙ byte[]
➙ 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());
Related videos on Youtube

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, 2020Comments
-
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 over 8 yearsWhy is this necessary? Doesn't this load an extra (large) byte array into memory?
-
Möoz about 8 yearsTried this, got a compile error on the third line: "The method ByteArrayInputStream(byte[]) is undefined for the type" What does that mean?
-
Sorter about 8 yearsHave you made the import correctly. The constructor is correct. docs.oracle.com/javase/7/docs/api/java/io/…
-
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 about 5 yearsDoesn't anything need to be closed anywhere? I'm not asking to be mean, I simply dont know ;)
-
Sorter about 5 yearsLet your IDE do that for you.
-
Sorter about 4 yearsYou can find the code below
-
Basil Bourque about 3 years@Nicofisi Both
ByteArrayOutputStream
&InputStream
implementAutoCloseable
. So you can use try-with-resources syntax to conveniently and automatically close those resources whether or not exceptions are thrown. -
Nikita Kobtsev 9 monthsIt's funny that this code snippet works much more efficiently than the approved one, although not as elegant
-
Nikita Kobtsev 9 monthsBut it is worth noting that this will only work with images where byte[] is used to represent each pixel