用imageio读取png文件出现错误

shenjunstar 2015-04-30 02:41:53
最近在做一个截取图片的功能,碰到一个问题,在截取png图片的时候出现如下问题:
javax.imageio.IIOException: I/O error reading PNG header!
at com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:315)
at com.sun.imageio.plugins.png.PNGImageReader.getWidth(PNGImageReader.java:1332)
at com.mep.util.ImgCutter.readUsingImageReader(ImgCutter.java:57)
at com.mep.action.MepNewAction.uploadHeadPhoto(MepNewAction.java:63)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:452)
at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:291)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:254)
at com.svw.cnaic.tapm.system.common.CoreInterceptor.intercept(CoreInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:176)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:263)
at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:207)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:314)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:270)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:176)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:190)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:187)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at com.svw.cnaic.tapm.system.common.AuthorityInterceptor.intercept(AuthorityInterceptor.java:66)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:248)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:498)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:745)
Caused by: javax.imageio.IIOException: Bad PNG signature!
at com.sun.imageio.plugins.png.PNGImageReader.readHeader(PNGImageReader.java:242)
... 72 more

查看源码是这里出问题:
try {
byte[] signature = new byte[8];
stream.readFully(signature);

if (signature[0] != (byte)137 ||
signature[1] != (byte)80 ||
signature[2] != (byte)78 ||
signature[3] != (byte)71 ||
signature[4] != (byte)13 ||
signature[5] != (byte)10 ||
signature[6] != (byte)26 ||
signature[7] != (byte)10) {
throw new IIOException("Bad PNG signature!");
}

但是不知道怎么解决,有没有人知道帮助下~~~
...全文
1495 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
gloomyfish 2015-04-30
  • 打赏
  • 举报
回复
试试ImageIO.read()
nicholasbobo 2015-04-30
  • 打赏
  • 举报
回复
运行了下你的代码,并没有报错,初步判断是你的图片文件有问题,并不是png的图片,只是后缀是png而已,建议ImageIO.getImageReadersByFormatName(suffix);换成另一个方法Iterator<ImageReader> readers = ImageIO.getImageReaders(new FileImageInputStream(new File(srcFilePath)));
shenjunstar 2015-04-30
  • 打赏
  • 举报
回复
引用 3 楼 Chengyajie521 的回复:
PNG文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A 这段源码的作用是分析文件头是否为PNG格式文件 显然这里验证你文件是有问题的,可能是读取的问题,也可能是文件本身问题
我试过了QQ截图生成的png,和安卓截图的png还有AdobeIllustrator生成的png都不行,我发下我的代码,你看下有什么问题。谢谢
public class ImgCutter {
	
	private String srcFilePath;
	private String destFilePath;

	public ImgCutter(String srcFilePath, String destFilePath){
		this.srcFilePath = srcFilePath;
		this.destFilePath = destFilePath;
	}
	/**
	 * @date:2015年4月24日 上午9:00:51 
	 * @param imgPath
	 * @throws IOException
	 * @Description:
	 */
	public void readUsingImageReader() throws IOException {
		if(StringUtil.isEmpty(srcFilePath)){
			throw new IllegalArgumentException("srcFilePath couldn't be empty");
		}
		int dot = srcFilePath.lastIndexOf(".");
		String suffix = "";
		if((dot >-1) && (dot < (srcFilePath.length() - 1))){
			suffix = srcFilePath.substring(dot+1);
		} else {
			throw new IllegalArgumentException("srcFilePath is not a file");
		}
		
		// 取得图片读入器
		Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName(suffix);
		ImageReader reader = (ImageReader) readers.next();
		
		// 取得图片读入流
		InputStream source = this.parseImagePath(srcFilePath);
		ImageInputStream iis = ImageIO.createImageInputStream(source);
		reader.setInput(iis, true);

		// 图片参数
		ImageReadParam param = reader.getDefaultReadParam();
		int imageIndex = 0;
		int imgWidth = reader.getWidth(imageIndex);
		int imgHeight = reader.getHeight(imageIndex);
		Rectangle rect = null;
		if(imgWidth>imgHeight){
			rect = new Rectangle((imgWidth-imgHeight)/2, 0, reader.getHeight(imageIndex), reader.getHeight(imageIndex));
		} else {
			rect = new Rectangle(0, (imgHeight-imgWidth)/2, reader.getWidth(imageIndex), reader.getWidth(imageIndex));
		}
		param.setSourceRegion(rect);
		BufferedImage bi = reader.read(0, param);
		ImageOutputStream ios = initDestFile();
		ImageIO.write(bi, suffix, ios);
		iis.close();
		source.close();
		ios.close();
	}

	private ImageOutputStream initDestFile() throws IOException {
		ImageOutputStream outputStream = ImageIO.createImageOutputStream(new File(destFilePath));
		return outputStream;
	}

	private InputStream parseImagePath(String srcFile) throws FileNotFoundException {
		InputStream inputStream = new FileInputStream(new File(srcFile));
		return inputStream;
	}
	
	public String getSrcFilePath() {
		return srcFilePath;
	}

	public void setSrcFilePath(String srcFilePath) {
		this.srcFilePath = srcFilePath;
	}

	public String getDestFilePath() {
		return destFilePath;
	}

	public void setDestFilePath(String destFilePath) {
		this.destFilePath = destFilePath;
	}

	public static void main(String[] args) {
		ImgCutter imgCutter = new ImgCutter("c:/temp/avatar.png","c:/temp/avatar.png");
		try {
			imgCutter.readUsingImageReader();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
Chengyajie521 2015-04-30
  • 打赏
  • 举报
回复
PNG文件头标识 (8 bytes) 89 50 4E 47 0D 0A 1A 0A 这段源码的作用是分析文件头是否为PNG格式文件 显然这里验证你文件是有问题的,可能是读取的问题,也可能是文件本身问题
shenjunstar 2015-04-30
  • 打赏
  • 举报
回复
引用 1 楼 Chengyajie521 的回复:
源码哪有问题?
源码没有问题,我是打断点跟着异常到了这里,不知道怎么解决,有什么办法没
Chengyajie521 2015-04-30
  • 打赏
  • 举报
回复
源码哪有问题?

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧