bajla bajla - 1 year ago 148
Java Question

Convert and display image from byte array

I'm making a program, which gets data about an image in byte array from a server. I'm converting this data into 24bit BMP format (whether its jpeg, png, bmp or 8-24-32bpp). First, I'm saving it to my HD, and then I'm loading it into a JLabel's Icon. Works perfectly, though there are some cases in which I get the following exception: at at
com.sun.imageio.plugins.bmp.BMPImageReader.read24Bit( at at at

For this line (the second)

File imgFile = new File("d:/image.bmp");
BufferedImage image =;

In these cases:

  • the image does not load into the JLabel, but it can be found on my HD

  • the conversion is not proper, because something "slips"

  • the picture is like when you use italics in a word document

First, i thought maybe the bpp is the problem, then i thought that maybe the pictures are too large, but i have cases it works and cases it doesn't for both suggestions. I'm a little stuck here, and would be glad for ideas.

Answer Source
  • the picture is like .. when You use italics in a word document

Think I finally got what this bullet item meant now.. ;-)

Speculative answer, but here goes:

If the image you write looks "skewed", it's probably due to missing padding for each column as the BMP format specifies (or incorrect width field in the BMP header). I assume then, that the images you get EOF exceptions for, is where the width is not a multiple of 4.

Try to write the BMPs using ImageIO to see if that helps:

private static BufferedImage createRGBImage(byte[] bytes, int width, int height) {
    DataBufferByte buffer = new DataBufferByte(bytes, bytes.length);
    ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), new int[]{8, 8, 8}, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
    return new BufferedImage(cm, Raster.createInterleavedRaster(buffer, width, height, width * 3, 3, new int[]{0, 1, 2}, null), false, null);


byte[] bytes = ...; // Your image bytes
OutputStream stream = ...; // Your output

BufferedImage image = createRGBImage(bytes, width, height);

try {
    ImageIO.write(image, "BMP", stream);
finally {