读取GIF图像时的ImageIO抛出IndexOutOfBoundsException:off< 0 || len< 0 || off + len> b.length || off + len< 0

时间:2015-07-13 21:34:13

标签: java gif javax.imageio

使用ImageIO库阅读一些GIF图像时,我遇到了这个例外:

java.lang.IndexOutOfBoundsException: off < 0 || len < 0 || off+len > b.length || off+len < 0!
 at javax.imageio.stream.FileCacheImageInputStream.read(FileCacheImageInputStream.java:157)
 at com.sun.imageio.plugins.gif.GIFImageReader.getCode(GIFImageReader.java:306)
 at com.sun.imageio.plugins.gif.GIFImageReader.read(GIFImageReader.java:909)
 at javax.imageio.ImageIO.read(ImageIO.java:1422)
 at javax.imageio.ImageIO.read(ImageIO.java:1326)
 ...

好像是内部bug GifImageReader。有办法解决这个问题吗?代码在Java 6下运行。

修改 经过一些调试我发现,问题不在于读取gif图像,而在于编写它。

用于编写图像的我(缩小)代码:

// Buffered image, using Scalr for resize it
BufferedImage resizedImage = Scalr.resize(image, Method.AUTOMATIC, resizeMode, maxWidth, maxHeight);

ByteArrayOutputStream tmp = new ByteArrayOutputStream();
ImageIO.write(resizedImage, "gif", tmp);
return new ByteArrayInputStream(tmp.toByteArray());
// then converted into blob and persisted into Oracle DB

当我使用Oracle SQL Developer查看数据库中的blob时,作为文本的数据包含大量(即〜4MB)二进制数据,以:

开头
GIF89a ÷ %*4?40<B=JCEDKDSF:KLKDLTLL

在我尝试将其视为图像的同一工具(OSD)中,它只打印我相同的字符串(为什么???):

off < 0 || len < 0 || off+len > b.length || off+len < 0

仅适用于某些GIF文件。似乎所有这些都是从另一种格式(JPG,PNG)转换而来。所以文件可能搞砸了,但读取时这个低级异常会给我带来麻烦。因为在将图像写入blob时,一切似乎都没问题,而且只有在阅读时才会出现异常。

对于读取(抛出异常时)代码很简单:

byte[] imageData = ...  
ByteArrayInputStream inStream = new ByteArrayInputStream(imageData);
BufferedImage img = ImageIO.read(inStream); // IndexOutOfBoundsException

0 个答案:

没有答案