转换并显示字节数组中的图像

我正在制作一个程序,它从服务器获取有关字节数组中图像的数据。 我正在将这些数据转换为24位BMP格式(无论是jpeg,png,bmp还是8-24-32bpp)。 首先,我将它保存到我的HD,然后我将它加载到JLabel的Icon中。 虽然在某些情况下我得到以下exception,但效果很好:

java.io.EOFException at javax.imageio.stream.ImageInputStreamImpl.readFully(ImageInputStreamImpl.java:353) at com.sun.imageio.plugins.bmp.BMPImageReader.read24Bit(BMPImageReader.java:1188) at com.sun.imageio.plugins.bmp.BMPImageReader.read(BMPImageReader.java:843) at javax.imageio.ImageIO.read(ImageIO.java:1448) at javax.imageio.ImageIO.read(ImageIO.java:1308) 

这条线(第二条)

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

在这些情况下:

  • 图像没有加载到JLabel中,但它可以在我的HD上找到
  • 转换不合适,因为某些事情“滑倒”
  • 图片就像在word文档中使用斜体

首先,我想也许bpp是问题,然后我认为可能图片太大了,但我有案例它的工作和案例它不适用于这两个建议。 我有点被困在这里,并且很乐意提出想法。

  • 当你在word文档中使用斜体时,图片就像..

想想我终于得到了这个子弹项目的意思.. 😉

思辨答案,但这里是:

如果您编写的图像看起来“倾斜”,则可能是由于BMP格式指定的每列缺少填充(或BMP标头中的宽度字段不正确)。 我假设,你获得EOFexception的图像是宽度不是4的倍数。

尝试使用ImageIO编写BMP以查看是否有帮助:

 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 { stream.close(); } 

通过类名称来调用它,liek ClassName.byteArrayToImage(byte)

 public static BufferedImage byteArrayToImage(byte[] bytes){ BufferedImage bufferedImage=null; try { InputStream inputStream = new ByteArrayInputStream(bytes); bufferedImage = ImageIO.read(inputStream); } catch (IOException ex) { System.out.println(ex.getMessage()); } return bufferedImage; } 

您可以使用此代码将输出图像转换为字节数组

  Blob b = rs.getBlob(2); byte barr[] = new byte[(int)b.length()]; //create empty array barr = b.getBytes(1,(int)b.length()); FileOutputStream fout = new FileOutputStream("D:\\sonoo.jpg"); fout.write(barr);