使用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