ImageIO.read -> Error reading PNG image data

super-d2 发布于 2014/10/14 21:34
阅读 4K+
收藏 0
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文件是可以读取


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







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