【发布时间】:2013-08-07 10:25:53
【问题描述】:
我正在制作一个程序,它从服务器获取有关字节数组中图像的数据。我正在将此数据转换为 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 的问题,然后我认为可能是图片太大了,但我有案例可以工作,也有案例不能满足这两个建议。我有点卡在这里,很高兴有想法。
【问题讨论】:
-
这些图片是您创建的吗?我能想到的只是它们是用 ImageIO 不支持的某种 BMP 格式创建的。也许如果您尝试编辑图像并再次保存它们。
-
我认为问题在于某些图片没有 EOF 字节,这就是您收到
java.io.EOFException的原因。我在使用jpeg格式时遇到了同样的问题。如果您认为文件的元数据具有有关文件长度的信息,那么这很有意义,因此不需要 EOF。这个事实解释了为什么你的文件可以在你的 HD 中找到(我猜甚至可以打开)但你在 java 中得到了异常。 -
查看this 链接,这里有我使用
jpeg图片的经验的解释,希望对您有所帮助。 -
@dic19 感谢您的想法!是的,它可以打开,但不能使用 imageIO。您的解决方案如何无法解决我的问题,但它很有用,因为现在我知道,我遇到异常的那些文件没有提到的 EOF 字节。另一件事,我将代码中的 system.arraycopy 行切换到了 arrays.copyof ,因为我收到了参数错误。
-
@Piro:是的,我已经创建了它们,服务器提供 RGB 值数据。我使用 Philipp C. Heckel 的位图编码器(版权)创建图像,并对其进行了一些修改
标签: java image swing javax.imageio