开发者社区> 问答> 正文

ImageIO.read -> Error reading PNG image data:报错

package imgIOTest;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import javax.imageio.ImageIO;
public class Test23 {
public static void main(String[] args) {
String filePath = "F:\图片压缩问题\wKgBEFQ7VZqAcVYsAAfIvKuNK1s5607 - xx.png";
byte[] bytes = getBytes(filePath);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
bytes);
try {
BufferedImage image = ImageIO.read(byteArrayInputStream);// 问题代码段
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


/**
* 获得指定文件的byte数组
*/
public static byte[] getBytes(String filePath) {
byte[] buffer = null;
try {
File file = new File(filePath);
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
byte[] b = new byte[1000];
int n;
while ((n = fis.read(b)) != -1) {
bos.write(b, 0, n);
}
fis.close();
bos.close();
buffer = bos.toByteArray();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
}
}


上面是我写的一段代码,用户读取文件并且解析;

解析某个文件之后,出现了如下的异常:

javax.imageio.IIOException: Error reading PNG image data
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1271)
at com.sun.imageio.plugins.png.PNGImageReader.read(PNGImageReader.java:1478)
at javax.imageio.ImageIO.read(ImageIO.java:1422)
at javax.imageio.ImageIO.read(ImageIO.java:1326)
at imgIOTest.Test23.main(Test23.java:27)
Caused by: java.util.zip.ZipException: incorrect data check
at java.util.zip.InflaterInputStream.read(InflaterInputStream.java:147)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at java.io.DataInputStream.readFully(DataInputStream.java:178)
at com.sun.imageio.plugins.png.PNGImageReader.decodePass(PNGImageReader.java:1068)
at com.sun.imageio.plugins.png.PNGImageReader.decodeImage(PNGImageReader.java:1172)
at com.sun.imageio.plugins.png.PNGImageReader.readImage(PNGImageReader.java:1264)
... 4 more
这个问题不是对所有的图片都是这样子的,只是个别,是用户自己提交上来的图片,占图片库的很大的一部分;

所以这个解析问题是一定要解决的。

有几点:

1、根据错误的提示我初步断定是原图是被损坏过的图片,所以数据不完整,解析就会出错了;

2、图片的读取是使用javax的imageio,想问有没有其他读取的方法?

3、用图片软件ps、浏览器等都可以打开;

4、ps处理过png文件是可以读取


有请各路大神帮帮忙指点迷津,小弟临表涕零,不胜感激,谢谢谢谢谢!







展开
收起
kun坤 2020-06-07 14:24:10 5122 0
1 条回答
写回答
取消 提交回答
  • 因为Java原生的ImageIO对某些形式的图片做不到特别兼容,而Java官网也一直没有改善这方面的动作,所有目前基本上都不再使用ImageIO进行图片的处理。推荐你一个比较大众化的解决办法,是采用ImageMagick这个图片处理软件,配以它的Java接口,可以实现高效的图片处理,而且功能上比ImageIO丰富很多。######回复 @有明丶 : 小弟临表涕零,不胜感激,谢谢谢谢谢######回复 @super-d2 : 小弟临表涕零,不胜感激,谢谢谢谢谢!######回复 @super-d2 : 是的。 GraphicsMagick 是 ImageMagick 的一个分支,某些功能上比ImageMagick好。######graphicsmagick http://www.graphicsmagick.org/ 是这个么?貌似好多图片处理软件都是用这个工具

    2020-06-07 14:24:15
    赞同 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
<img src...[mitah].1536575523.pdf 立即下载
How big data can help small data? 立即下载
The Value of Exploratory Data 立即下载