Java: BufferedImage to byte array and back

78,562

Solution 1

This is recommended to convert to a byte array

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
byte[] bytes = baos.toByteArray();

Solution 2

Note that calling close or flush will do nothing, you can see this for yourself by looking at their source/doc:

Closing a ByteArrayOutputStream has no effect.

The flush method of OutputStream does nothing.

Thus use something like this:

ByteArrayOutputStream baos = new ByteArrayOutputStream(THINK_ABOUT_SIZE_HINT);
boolean foundWriter = ImageIO.write(bufferedImage, "jpg", baos);
assert foundWriter; // Not sure about this... with jpg it may work but other formats ?
byte[] bytes = baos.toByteArray();

Here are a few links concerning the size hint:

Of course always read the source code and docs of the version you are using, do not rely blindly on SO answers.

Share:
78,562
user1875290
Author by

user1875290

Updated on July 05, 2022

Comments

  • user1875290
    user1875290 about 2 years

    I see that a number of people have had a similar problem, however I'm yet to try find exactly what I'm looking for.

    So, I have a method which reads an input image and converts it to a byte array:

        File imgPath = new File(ImageName);
        BufferedImage bufferedImage = ImageIO.read(imgPath);
        WritableRaster raster = bufferedImage .getRaster();
        DataBufferByte data   = (DataBufferByte) raster.getDataBuffer();
    

    What I now want to do is convert it back into a BufferedImage (I have an application for which I need this functionality). Note that "test" is the byte array.

        BufferedImage img = ImageIO.read(new ByteArrayInputStream(test));
        File outputfile = new File("src/image.jpg");
        ImageIO.write(img,"jpg",outputfile);
    

    However, this returns the following exception:

        Exception in thread "main" java.lang.IllegalArgumentException: im == null!
    

    This is because the BufferedImage img is null. I think this has something to do with the fact that in my original conversion from BufferedImage to byte array, information is changed/lost so that the data can no longer be recognised as a jpg.

    Does anyone have any suggestions on how to solve this? Would be greatly appreciated.

  • Christophe Roussy
    Christophe Roussy over 10 years
    Flush and close will do nothing
  • hguser
    hguser about 10 years
    Is there a special reason to use jpg here?
  • user207421
    user207421 almost 10 years
    And if close() didn't do anything it would call flush() itself, and it would be necessary to call itbefore toByteArray(), not after it.