ImageIO.read()报错:ArrayIndexOutOfBoundsException: 4096、IIOException: I/O error reading PNG header!

2018-11-29 12:35:58
1193次阅读
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

登录 后评论。没有帐号? 注册 一个。