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文件是可以读取
有请各路大神帮帮忙指点迷津,小弟临表涕零,不胜感激,谢谢谢谢谢!
因为Java原生的ImageIO对某些形式的图片做不到特别兼容,而Java官网也一直没有改善这方面的动作,所有目前基本上都不再使用ImageIO进行图片的处理。推荐你一个比较大众化的解决办法,是采用ImageMagick这个图片处理软件,配以它的Java接口,可以实现高效的图片处理,而且功能上比ImageIO丰富很多。######回复 @有明丶 : 小弟临表涕零,不胜感激,谢谢谢谢谢######回复 @super-d2 : 小弟临表涕零,不胜感激,谢谢谢谢谢!######回复 @super-d2 : 是的。 GraphicsMagick 是 ImageMagick 的一个分支,某些功能上比ImageMagick好。######graphicsmagick http://www.graphicsmagick.org/ 是这个么?貌似好多图片处理软件都是用这个工具
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。