Java ArrayIndexOutOfBoundsException:读取gif文件时出现4096

Java ArrayIndexOutOfBoundsException:读取gif文件时出现4096,java,gif,javax.imageio,Java,Gif,Javax.imageio,我能够阅读png文件。但读取gif文件时获取ArrayIndexOutOfBoundsException:4096 byte[] fileData = imageFile.getFileData(); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData); RenderedImage image = ImageIO.read(byteArrayInputStream) 抛出的异常看起来像 j

我能够阅读png文件。但读取gif文件时获取ArrayIndexOutOfBoundsException:4096

byte[] fileData = imageFile.getFileData();
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(fileData);
RenderedImage image = ImageIO.read(byteArrayInputStream)
抛出的异常看起来像

java.lang.ArrayIndexOutOfBoundsException: 4096
    at com.sun.imageio.plugins.gif.GIFImageReader.read(Unknown Source)
    at javax.imageio.ImageIO.read(Unknown Source)
    at javax.imageio.ImageIO.read(Unknown Source)

问题可能是什么?解决方案是什么?

更新3:解决方案

我最终开发了自己的GifDecoder,并在Apache许可证2.0下以开源形式发布了它。您可以从这里获取:。它不存在
ArrayIndexOutOfBoundsException
问题,并提供了良好的性能

非常感谢您的反馈。特别是,我想知道它是否适用于你所有的图像,你是否对它的速度感到满意

我希望这对你有帮助(:

初始答案

此错误报告可能与以下问题相关或描述了相同的问题:

引述:

FULL PRODUCT VERSION : java version "1.7.0_02" Java(TM) SE Runtime Environment (build 1.7.0_02-b13) Java HotSpot(TM) 64-Bit Server VM (build 22.0-b10, mixed mode) ADDITIONAL OS VERSION INFORMATION : Microsoft Windows [Version 6.1.7601] A DESCRIPTION OF THE PROBLEM : according to specification http://www.w3.org/Graphics/GIF/spec-gif89a.txt > There is not a requirement to send a clear code when the string table is full. However, GIFImageReader requires the clear code when the string table is full. GIFImageReader violates the specification, clearly. In the real world, sometimes people finds such high compressed gif image. so you should fix this bug. STEPS TO FOLLOW TO REPRODUCE THE PROBLEM : javac -cp .;PATH_TO_COMMONS_CODEC GIF_OverflowStringList_Test.java java -cp .;PATH_TO_COMMONS_CODEC GIF_OverflowStringList_Test EXPECTED VERSUS ACTUAL BEHAVIOR : EXPECTED - complete normally. no output ACTUAL - ArrayIndexOutOfBounds occurs. ERROR MESSAGES/STACK TRACES THAT OCCUR : Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 4096 at com.sun.imageio.plugins.gif.GIFImageReader.read(GIFImageReader.java:1 075) at javax.imageio.ImageIO.read(ImageIO.java:1400) at javax.imageio.ImageIO.read(ImageIO.java:1322) at GIF_OverflowStringList_Test.main(GIF_OverflowStringList_Test.java:8) REPRODUCIBILITY : This bug can be reproduced always. 完整产品版本: java版本“1.7.0_02” Java(TM)SE运行时环境(build 1.7.0_02-b13) Java HotSpot(TM)64位服务器虚拟机(构建22.0-b10,混合模式) 其他操作系统版本信息: Microsoft Windows[版本6.1.7601] 问题描述: 按规格 http://www.w3.org/Graphics/GIF/spec-gif89a.txt >当字符串表已满时,不需要发送清除代码。 但是,当字符串表已满时,GIFImageReader需要清除代码。 GIFImageReader显然违反了规范。 在现实世界中,有时人们会发现这样的高压缩gif图像。 所以你应该修复这个错误。 重现问题所需遵循的步骤: javac-cp;路径到公共空间编解码器GIF\u溢出tringlist\u Test.java java-cp;路径到公共空间编解码器GIF溢出测试 预期与实际行为: 期望- 正常完成,无输出 实际的- 出现ArrayIndexOutOfBounds。 发生的错误消息/堆栈跟踪: 线程“main”java.lang.ArrayIndexOutOfBoundsException中的异常:4096 在com.sun.imageio.plugins.gif.GIFImageReader.read(GIFImageReader.java:1 075) 在javax.imageio.imageio.read(imageio.java:1400)中 在javax.imageio.imageio.read(imageio.java:1322) 在GIF_OverflowStringList_Test.main(GIF_OverflowStringList_Test.java:8) 再现性: 这个错误总是可以复制的。 bug报告还提供了重现bug的代码

更新1

下面是一个导致我自己代码中出现错误的图像:

更新2

我尝试使用Apache Commons Imaging读取相同的图像,这导致了以下异常:

java.io.IOException: AddStringToTable: codes: 4096 code_size: 12 at org.apache.commons.imaging.common.mylzw.MyLzwDecompressor.addStringToTable(MyLzwDecompressor.java:112) at org.apache.commons.imaging.common.mylzw.MyLzwDecompressor.decompress(MyLzwDecompressor.java:168) at org.apache.commons.imaging.formats.gif.GifImageParser.readImageDescriptor(GifImageParser.java:388) at org.apache.commons.imaging.formats.gif.GifImageParser.readBlocks(GifImageParser.java:251) at org.apache.commons.imaging.formats.gif.GifImageParser.readFile(GifImageParser.java:455) at org.apache.commons.imaging.formats.gif.GifImageParser.readFile(GifImageParser.java:435) at org.apache.commons.imaging.formats.gif.GifImageParser.getBufferedImage(GifImageParser.java:646) at org.apache.commons.imaging.Imaging.getBufferedImage(Imaging.java:1378) at org.apache.commons.imaging.Imaging.getBufferedImage(Imaging.java:1292) java.io.IOException:AddStringToTable:code:4096 code\u size:12 位于org.apache.commons.imaging.common.mylzw.MyLzwDecompressor.addStringToTable(MyLzwDecompressor.java:112) 位于org.apache.commons.imaging.common.mylzw.MyLzwDecompressor.decompress(MyLzwDecompressor.java:168) 位于org.apache.commons.imaging.formats.gif.GifImageParser.readImageDescriptor(GifImageParser.java:388) 位于org.apache.commons.imaging.formats.gif.GifImageParser.readBlocks(GifImageParser.java:251) 位于org.apache.commons.imaging.formats.gif.GifImageParser.readFile(GifImageParser.java:455) 位于org.apache.commons.imaging.formats.gif.GifImageParser.readFile(GifImageParser.java:435) 位于org.apache.commons.imaging.formats.gif.GifImageParser.getBufferedImage(GifImageParser.java:646) 位于org.apache.commons.imaging.imaging.getBuffereImage(imaging.java:1378) 位于org.apache.commons.imaging.imaging.getBuffereImage(imaging.java:1292)
这看起来与ImageIO的问题非常相似,因此我在Apache Commons JIRA上报告了该错误:。

我遇到了与您完全相同的问题,但我必须坚持使用ImageIO接口,这是其他库所没有的。除了Jack的出色回答外,我只是用几句话修补了现有的
GiImageReader
类新的代码,并使它的边际工作

复制到
patchedgefimagereader.java
中并按如下方式使用:

reader = new PatchedGIFImageReader(null);
reader.setInput(ImageIO.createImageInputStream(new FileInputStream(files[i])));
int ub = reader.getNumImages(true);
for (int x=0;x<ub;x++) {
    BufferedImage img = reader.read(x);
    //Do whatever with the new img bufferedimage
reader=新的PatchedGiImageReader(空);
reader.setInput(ImageIO.createImageInputStream(新文件输入流(文件[i]));
int ub=reader.getNumImages(true);

对于(int x=0;xd)您尝试读取的每一个gif都会发生这种情况,还是仅使用特定的gif?我所有的gif几乎都会发生这种情况。您可以提供这些gif中的一个吗?您可能已经损坏了
.gif
文件(例如,太短/尚未完全传输等等)或者是一种gif,它不被
ImageIO
理解。这显然是内部GIFImageReader的一个bug,从未被修复过。哇,他们一直没有修复它,这太疯狂了。JDK 1.8.045这里…bug仍然存在:\n我最近遇到了一个类似的bug。在第11帧出现越界异常。非常好解释。感谢包含测试图像。此SO答案在IMAGING-130中链接,另一个参与者提交了一个已合并的请求。此修复程序将在commons-IMAGING-1.0-alpha2版本中提供。谢谢!Bruno