ImageIO.read()报错:ArrayIndexOutOfBoundsException: 4096、IIOException: I/O error reading PNG header!
2018-11-29 12:35:58
1255次阅读
0个评论
处理图片的时候,使用ImageIO.read()读取不同格式的图片(gif、png、jpg)出现错误。具体的错误以及解决方法如下所示
1)读取GIF图片,java.lang.ArrayIndexOutOfBoundsException: 4096
解决:对其进行解码。
https://github.com/DhyanB/Open-Imaging
参考链接中的readme.md, 只需下载 GifDecoder.java 和 LICENSE 文件到自己项目中,然后使用以下代码进行读取返回buff图像,其中for循环是遍历的动图中的每一帧img:
public static BufferedImage getDecoderImg(String imgName) throws Exception {
GifDecoder d = new GifDecoder();
d.read(imgName);
int n = d.getFrameCount();
BufferedImage img = null;
for (int i = 0; i < n; i++) {
img = d.getFrame(i); // frame i
if (img != null) {
break;
}
}
return img;
}
2)读取png格式图片出现错误:javax.imageio.IIOException: I/O error reading PNG header!
解决: 针对我的测试示例,打开图片可以看到与一般的png图片不同的是这个图片是动图,因此尝试用1)中的方法进行解码,不再报错。
**.png 图片示例
3) ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type
解决:https://github.com/haraldk/TwelveMonkeys
参考上述链接,将其安装信息导入pom文件,并使用以下代码:
解码:
4.再使用上述方法完美解决各种错误之后,还有一个终极错误:maven打包问题!
现在jdk一般使用1.7以上,但是上述decoder库是在1.6jre,因此打包会出现如下错误:
Maven 打包 程序包com.sun.image.codec.jpeg不存在
网上也有相关教程核心如下:
<bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar
但是,还是有些问题,最终采用了相似的方法将rt.jar 以及jce.jar使用maven安装后用依赖的形式导入,完美解决打包问题:
00