9

我正在制作一个程序,它从服务器获取有关字节数组中图像的数据。我正在将此数据转换为 24 位 BMP 格式(无论是 jpeg、png、bmp 还是 8-24-32bpp)。首先,我将其保存到我的 HD 中,然后将其加载到 JLabel 的图标中。完美运行,尽管在某些情况下我会遇到以下异常:

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 问题,然后我认为图片可能太大了,但我有一些案例它可以工作,而案例对于这两种建议都不起作用。我有点卡在这里,很高兴有想法。

4

3 回答 3

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

想我终于明白了这个项目符号现在的意思了.. ;-)

推测性的答案,但这里有:

如果您编写的图像看起来“倾斜”,则可能是由于 BMP 格式指定的每列缺少填充(或 BMP 标头中的宽度字段不正确)。然后,我假设您获得 EOF 异常的图像的宽度不是 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();
}
于 2013-08-07T14:01:15.703 回答
2

通过类名调用它,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;
}
于 2013-08-06T12:22:29.913 回答
0

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

   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);
于 2013-08-06T12:12:52.280 回答