背景:

  写了一个测试程序,目的是读取本地的图片,为其打上水印图片。在使用过程中总会遇到:javax.imageio.IIOException: Can't read input file!的错误,最开始以为是图片路径名称写的不对,按照网上的提示换成正斜线和反斜线都不行。后来发现问题的原因是:图片的路径中不能有点(英文点:.);

  具体的错误异常提示如下:

  1. javax.imageio.IIOException: Can't read input file!
  2. at javax.imageio.ImageIO.read(Unknown Source)
  3. at com.bomei.image.ImageUtils.pressImage(ImageUtils.java:41)
  4. at com.bomei.image.ImageUtils.main(ImageUtils.java:117)

  具体的代码如下:

  1. package com.bomei.image;
  2.  
  3. import java.awt.Color;
  4. import java.awt.Font;
  5. import java.awt.Graphics;
  6. import java.awt.Image;
  7. import java.awt.image.BufferedImage;
  8. import java.io.File;
  9. import java.io.FileOutputStream;
  10. import javax.imageio.ImageIO;
  11. import com.sun.image.codec.jpeg.JPEGCodec;
  12. import com.sun.image.codec.jpeg.JPEGImageEncoder;
  13.  
  14. public final class ImageUtils {
  15. public ImageUtils() {
  16.  
  17. }
  18.  
  19. /*
  20. * public final static String getPressImgPath() { return ApplicationContext
  21. * .getRealPath("/template/data/util/shuiyin.gif"); }
  22. */
  23.  
  24. /**
  25. * 把图片印刷到图片上
  26. *
  27. * @param pressImg --
  28. * 水印文件
  29. * @param targetImg --
  30. * 目标文件
  31. * @param x
  32. * --x坐标
  33. * @param y
  34. * --y坐标
  35. */
  36. public final static void pressImage(String pressImg, String targetImg,
  37. int x, int y) {
  38. try {
  39. //目标文件
  40. File _file = new File(targetImg);
  41. Image src = ImageIO.read(_file);
  42. int wideth = src.getWidth(null);
  43. int height = src.getHeight(null);
  44. BufferedImage image = new BufferedImage(wideth, height,
  45. BufferedImage.TYPE_INT_RGB);
  46. Graphics g = image.createGraphics();
  47. g.drawImage(src, 0, 0, wideth, height, null);
  48.  
  49. //水印文件
  50. File _filebiao = new File(pressImg);
  51. Image src_biao = ImageIO.read(_filebiao);
  52. int wideth_biao = src_biao.getWidth(null);
  53. int height_biao = src_biao.getHeight(null);
  54. g.drawImage(src_biao, (wideth - wideth_biao) / 2,
  55. (height - height_biao) / 2, wideth_biao, height_biao, null);
  56. //水印文件结束
  57. g.dispose();
  58. FileOutputStream out = new FileOutputStream(targetImg);
  59. JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  60. encoder.encode(image);
  61. out.close();
  62. } catch (Exception e) {
  63. e.printStackTrace();
  64. }
  65. }
  66.  
  67. /**
  68. * 打印文字水印图片
  69. *
  70. * @param pressText
  71. * --文字
  72. * @param targetImg --
  73. * 目标图片
  74. * @param fontName --
  75. * 字体名
  76. * @param fontStyle --
  77. * 字体样式
  78. * @param color --
  79. * 字体颜色
  80. * @param fontSize --
  81. * 字体大小
  82. * @param x --
  83. * 偏移量
  84. * @param y
  85. */
  86.  
  87. public static void pressText(String pressText, String targetImg,
  88. String fontName, int fontStyle, int color, int fontSize, int x,
  89. int y) {
  90. try {
  91. File _file = new File(targetImg);
  92. Image src = ImageIO.read(_file);
  93. int wideth = src.getWidth(null);
  94. int height = src.getHeight(null);
  95. BufferedImage image = new BufferedImage(wideth, height,
  96. BufferedImage.TYPE_INT_RGB);
  97. Graphics g = image.createGraphics();
  98. g.drawImage(src, 0, 0, wideth, height, null);
  99. // String s="www.qhd.com.cn";
  100. g.setColor(Color.RED);
  101. g.setFont(new Font(fontName, fontStyle, fontSize));
  102.  
  103. g.drawString(pressText, wideth - fontSize - x, height - fontSize
  104. / 2 - y);
  105. g.dispose();
  106. FileOutputStream out = new FileOutputStream(targetImg);
  107. JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
  108. encoder.encode(image);
  109. out.close();
  110. } catch (Exception e) {
  111. System.out.println(e);
  112. }
  113. }
  114.  
  115. public static void main(String[] args) {
  116. // pressImage("c:/test/safeqrcode.jpg","c:/test/poster.png", 0, 0);
  117. pressImage("C:\\Users\\g.wang\\Desktop\\Two_Dimension_Code\\safeqrcode.jpg","c:/test/poster.png", 0, 0);
  118. }
  119. }

  如上面代码中main函数中所示,方法调用的第一个参数含有g.wang的路径,即含有英文的句号(.),这样就会导致这个上面的异常出现,将会在(g.drawImage)处报出异常。将图片的位置更改到一个不含有英文点的路径即可解决这个问题。如下:

  1. pressImage("c:/test/safeqrcode.jpg","c:/test/poster.png", 0, 0);

  另外要说的一句是,网上好多的为图片打上水印图片的代码都不太好使,都是一个转一个的。找了好久才找到一篇好使的,原文链接如下:

  

  1. http://my.oschina.net/jgy/blog/55702?fromerr=AuPHExZk

  这篇文章介绍的为图片打上水印图片和水印文字的方法是好使的。

路径名导致的异常:javax.imageio.IIOException: Can't read input file!的更多相关文章

  1. javax.imageio.IIOException: Can't read input file!完美解决

    今天遇到一个问题,上图 这段代码主要是给图片添加水印 后来百度发现可能是图片的路径出了问题,因为是动态获取的图片地址,然后我把地址打印出来了 之后通过终端查看,果然没有 之后我在classes目录找到 ...

  2. javax.imageio.IIOException: Can't create cache file!

    javax.imageio.IIOException: Can't create cache file! at javax.imageio.ImageIO.createImageInputStream ...

  3. 网页验证码出不来,读取验证码时出错:javax.imageio.IIOException: Can't create cache file!

    版权声明:本文为博主原创文章,仅作为学习交流使用 转载请注明出处 https://www.cnblogs.com/linck/p/10593053.html 今天打开项目时,发现登陆界面的验证码出不来 ...

  4. javax.imageio.IIOException: Can't create output stream! (生成验证码Servlet)

    在  web.xml里面加入 下面的代码: <servlet>         <servlet-name>validatecode</servlet-name> ...

  5. 解决tomcat报错javax.imageio.IIOException: Can't create output stream!

    启动tomcat catalina.out报错如下,登陆的时候无法显示验证码 2017-06-09 11:23:06,628 DEBUG org.springframework.web.servlet ...

  6. 解决javax.imageio.IIOException: Can't create output stream!

    解决javax.imageio.IIOException: Can't create output stream! javax.imageio.ImageIO.write(image, "J ...

  7. alias导致virtualenv异常的分析和解法

    title: alias导致virtualenv异常的分析和解法 toc: true comments: true date: 2016-06-27 23:40:56 tags: [OS X, ZSH ...

  8. VS2012外接程序VMDebugger未能加载或导致了异常

    转http://blog.csdn.net/maryhuan/article/details/42676915 故障现象:打开Visual Studio 2010后弹出错误框,外接程序VMDebugg ...

  9. Fragment已经被added了导致的异常。

    java.lang.IllegalStateException: Fragment already added:  ******Effect 出现的原因是commit方法提交是异步的,所以容易出现,判 ...

随机推荐

  1. 剑指offer :跳台阶

    这题之前刷leetcode也遇到过,感觉是跟斐波拉契差不多的题. 题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果). 解 ...

  2. git学习(一) 如何将项目上传到github

    用了github有了段时间,但是感觉都是断断续续的,这次花了点时间来总结下,已方便下次忘记的时候拿出来看一下: 自己主要是参考了这个网站来学习的: git教程 -廖雪峰 第一步: 创建github账号 ...

  3. OSG学习:裁剪变换(2)

    接着上一篇博客说. 还有一种裁剪的方法:osg::Scissor类. 这个类封装了OpenGL中的glScissor()函数. 该类主要用于设置一个视口裁剪平面举行.设置裁剪平面举行的函数如下: vo ...

  4. 配置高可用集群(实验) corosyne+pacemaker

    环境准备: 一准备三个虚拟机,把/etc/hosts/文件配置好                              192.168.43.9 node0                     ...

  5. Beta阶段冲刺前的准备

    Beta阶段冲刺前的准备 凡事预则立,在Beta开始前,以小组为单位,在敏捷冲刺前发布一篇博客,描述: 1. 讨论组长是否重选的议题和结论 经过我们小组在周二下午的会议中有重新认真的考虑了是否要更换组 ...

  6. 软工网络15团队作业8——Beta阶段敏捷冲刺(用户使用调查报告)

    一.项目概述 1.项目名称 考研必背 2.项目简介 微信小程序,帮助考研学生记忆单词. 3.项目预期达到目标 用户无需下载app,仅通过微信小程序就可以达到背单词的目的,并且能够制定背单词的计划. 4 ...

  7. ORA-06530: 引用未初始化的组合 ;

    select * FROM TABLE(fun_test_1) : ORA-06530: 引用未初始化的组合ORA-06512: 在 "PCISS.FUN_TEST_1", lin ...

  8. selenium使用execl实现数据驱动测试

    import java.io.FileInputStream;import java.io.IOException;import java.io.InputStream;import java.uti ...

  9. delphi adoquery的post和UpdateBatch

    delphi adoquery的post和UpdateBatch Post是确认当前的修改,而UpdateBatch是把已经确认但是没有存盘的数据写入数据库当ADOQuery的CursorType是c ...

  10. Java线程池(一):初识

    1.什么是线程池? 简单粗暴的理解就是:装着一个或多个线程的容器,我们称这个容器为线程池. 在现实世界中,有着各种各样的“池”,例如游泳池.花池等等.那花池来说,里面种满了各种各样的鲜花,花池本身要做 ...