imageio安装失败 (用imagetool读取raw图)

昨天,在上传GIF图片的时候报了一个错:

java.lang.ArrayIndexOutOfBoundsException: 4096
        at com.sun.imageio.plugins.gif.GIFImageReader.read(GIFImageReader.java:984)
        at javax.imageio.ImageIO.read(ImageIO.java:1448)
        at javax.imageio.ImageIO.read(ImageIO.java:1308)
        at com.azxf.util.ImageUtils.zoom(ImageUtils.java:161)

这个错误很明显,就是读取GIF图片的时候有问题,读取不到。

这个问题,其实把那个GIF图片用photoshop重新保存下就可以了。然而,这样处理一两个还可以,多的话客户不干啊,还是要想其他办法处理。

我们上传的时候会对图片进行压缩,来当作缩略图,压缩时会读取图片做处理,涉及到的代码如下:

public BufferedImage getBufferedImage(String path) {

        BufferedImage bufferedImage = null;
        try {
                File file = new File(path);
                bufferedImage = ImageIO.read(file);
        }
        catch (IOException e) {
                throw new RuntimeException(e);
        }
        return bufferedImage;
}

尴尬的是,ImageIO、GIFImageReader都是JDK自带的类,好像没办法修改。看到有资料说JDK6到JDK8都有这个问题,把JDK升级到9以上就没问题了。但是,JDK哪能 说升就能升,只能寻找其他解决方法了。

最终的办法是引用第三方包,修改代码来解决。

1、先导入支持解析GIF的包。

<dependency>
    <groupId>com.madgag</groupId>
    <artifactId>animated-gif-lib</artifactId>
    <version>1.4</version>
</dependency>

2、然后再修改代码,通过文件后缀判断是否是GIF图片,是GIF图片就采用GifDecoder来读取GIF图片。修改后的代码如下:

public BufferedImage getBufferedImage(String path) {

        BufferedImage bufferedImage = null;
        try {
                String extension = FilenameUtils.getExtension(path);
                if ("gif".equalsIgnoreCase(extension)) {
                        //通过GifDecoder来读取gif图片
                        GifDecoder decoder = new GifDecoder();
                        decoder.read(path);
                        bufferedImage = decoder.getImage();
                }
                else {
                        File file = new File(path);
                        bufferedImage = ImageIO.read(file);
                }
        }
        catch (IOException e) {
                throw new RuntimeException(e);
        }
        return bufferedImage;
}

至此,完美解决使用ImageIO读取GIF图片报错的问题,一劳永逸。