zoukankan      html  css  js  c++  java
  • 路径名导致的异常:javax.imageio.IIOException: Can't read input file!

    背景:

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

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

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

      具体的代码如下:

    package com.bomei.image;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import javax.imageio.ImageIO;
    import com.sun.image.codec.jpeg.JPEGCodec;
    import com.sun.image.codec.jpeg.JPEGImageEncoder;
     
    public final class ImageUtils {
        public ImageUtils() {
     
        }
     
        /*
         * public final static String getPressImgPath() { return ApplicationContext
         * .getRealPath("/template/data/util/shuiyin.gif"); }
         */
     
        /**
         * 把图片印刷到图片上
         * 
         * @param pressImg --
         *            水印文件
         * @param targetImg --
         *            目标文件
         * @param x
         *            --x坐标
         * @param y
         *            --y坐标
         */
        public final static void pressImage(String pressImg, String targetImg,
                int x, int y) {
            try {
                //目标文件
                File _file = new File(targetImg);
                Image src = ImageIO.read(_file);
                int wideth = src.getWidth(null);
                int height = src.getHeight(null);
                BufferedImage image = new BufferedImage(wideth, height,
                        BufferedImage.TYPE_INT_RGB);
                Graphics g = image.createGraphics();
                g.drawImage(src, 0, 0, wideth, height, null);
     
                //水印文件
                File _filebiao = new File(pressImg);
                Image src_biao = ImageIO.read(_filebiao);
                int wideth_biao = src_biao.getWidth(null);
                int height_biao = src_biao.getHeight(null);
                g.drawImage(src_biao, (wideth - wideth_biao) / 2,
                        (height - height_biao) / 2, wideth_biao, height_biao, null);
                //水印文件结束
                g.dispose();
                FileOutputStream out = new FileOutputStream(targetImg);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(image);
                out.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
        /**
         * 打印文字水印图片
         * 
         * @param pressText
         *            --文字
         * @param targetImg --
         *            目标图片
         * @param fontName --
         *            字体名
         * @param fontStyle --
         *            字体样式
         * @param color --
         *            字体颜色
         * @param fontSize --
         *            字体大小
         * @param x --
         *            偏移量
         * @param y
         */
     
        public static void pressText(String pressText, String targetImg,
                String fontName, int fontStyle, int color, int fontSize, int x,
                int y) {
            try {
                File _file = new File(targetImg);
                Image src = ImageIO.read(_file);
                int wideth = src.getWidth(null);
                int height = src.getHeight(null);
                BufferedImage image = new BufferedImage(wideth, height,
                        BufferedImage.TYPE_INT_RGB);
                Graphics g = image.createGraphics();
                g.drawImage(src, 0, 0, wideth, height, null);
                // String s="www.qhd.com.cn";
                g.setColor(Color.RED);
                g.setFont(new Font(fontName, fontStyle, fontSize));
     
                g.drawString(pressText, wideth - fontSize - x, height - fontSize
                        / 2 - y);
                g.dispose();
                FileOutputStream out = new FileOutputStream(targetImg);
                JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
                encoder.encode(image);
                out.close();
            } catch (Exception e) {
                System.out.println(e);
            }
        }
     
        public static void main(String[] args) {
    //        pressImage("c:/test/safeqrcode.jpg","c:/test/poster.png", 0, 0);
            pressImage("C:\Users\g.wang\Desktop\Two_Dimension_Code\safeqrcode.jpg","c:/test/poster.png", 0, 0);
        }
    }

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

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

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

      

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

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

  • 相关阅读:
    C# GDI+ 文字 阴影,描边 的实现
    NDatabase 入门,简单使用 增删改查。让NDatabase带你脱离ADO.net,各种SQL 语句,各种DBMS,各种CRM,IOC之类的烦恼。我们也不需要仓库设计模式了,你妹的。不要表了,不要设计数据库字段了。就这样!
    D3D 光和材质
    DirectX D3D texture 的Level,解释。。。。
    学习openssl中的hash算法
    ubuntu下使用魅族mx真机调试android程序
    boost 获取时间并格式化
    Mysql:The table‘xxxx’is full
    使用pmap查看进程占用的内存情况
    编译antrl c runtime 3.5步骤
  • 原文地址:https://www.cnblogs.com/wanggangblog/p/5140387.html
Copyright © 2011-2022 走看看