昨天,在上传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图片报错的问题,一劳永逸。