java - ArrayIndexOutOfBoundsException : 4096 while reading gif file

标签 java gif javax.imageio

我能够读取 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 License 2.0 将其作为开源软件发布。你可以从这里得到它:https://github.com/DhyanB/Open-Imaging .它不会遇到 ArrayIndexOutOfBoundsException 问题并提供不错的性能。

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

希望对您有所帮助(:

初步回答

也许这个错误报告与相同的问题相关或描述了相同的问题:https://bugs.openjdk.java.net/browse/JDK-7132728 .

引用:

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.

错误报告还提供了重现错误的代码。

更新 1

这是一张导致我自己的代码出现错误的图片:

enter image description here

更新 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)

这看起来与我们在 ImageIO 中遇到的问题非常相似,所以我在 Apache Commons JIRA 上报告了这个错误:https://issues.apache.org/jira/browse/IMAGING-130 .

关于java - ArrayIndexOutOfBoundsException : 4096 while reading gif file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22259714/

相关文章:

java - 使用内部类通过构建器模式扩展对象

java - 字符串中的换行符检测

java - 构造子串的字符串操作

python - Tkinter:在没有 PIL 的情况下在 Canvas 上移动 Gif

html - 全屏背景 gif 在 Firefox 中不起作用

java - Java和Matlab的图像处理结果不同

java.awt.color.CMMException : LCMS error 12288

java - 用 Java 将 dpi 元数据写入 jpeg 图像

java - 调用匿名 JavaScript 函数

android - 在 Java Android 中获取 GIF 持续时间的最佳方法是什么?