图片格式转换收缩和添加水印工具

来源:互联网 发布:亿恩网络 编辑:程序博客网 时间:2024/05/18 14:45

一.图片收缩和添加水印工具类 ImageProcessUtils:


package com.ftk.eloan.framework.utils;import java.awt.AlphaComposite;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.Graphics2D;import java.awt.Image;import java.awt.geom.AffineTransform;import java.awt.image.AffineTransformOp;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import javax.imageio.ImageIO; /** * 图片工具类, 图片水印,文字水印,缩放,补白等 * @author Carl He */public final class ImageProcessUtils {    /**图片格式:JPG*/    private static final String PICTRUE_FORMATE_JPG = "jpg";        /**      * 缩小并转换格式      *       * @param srcPath源路径      * @param destPath目标路径      * @param height目标高      * @param width      *            目标宽      * @param formate      *            文件格式      * @return      *        boolean flag = ImageProcessUtils.narrowAndFormateTransfer("E:\\我的图片/雨伞.jpg",        "E:\\我的图片/雨伞.png", 400, 400, "png");     */      public  static boolean narrowAndFormateTransfer(String srcPath, String destPath, int height, int width, String formate) {        boolean flag = false;        BufferedImage src =null;        try {            File file = new File(srcPath);              File destFile = new File(destPath);              if (!destFile.getParentFile().exists()) {                  destFile.getParentFile().mkdir();              }              src = ImageIO.read(file); // 读入文件            Image image = src.getScaledInstance(width, height, Image.SCALE_DEFAULT);              BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);              Graphics g = tag.getGraphics();              g.drawImage(image, 0, 0, null); // 绘制缩小后的图              g.dispose();            flag = ImageIO.write(tag, formate, new FileOutputStream(destFile));// 输出到文件流        } catch (IOException e) {              e.printStackTrace();          }finally {            src.flush();        }        return flag;      }        /**     * 添加图片水印     * @param targetImg 目标图片路径,如:C://myPictrue//1.jpg     * @param waterImg 水印图片路径,如:C://myPictrue//logo.png     * @param x 水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间     * @param y 水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间     * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)     */    public final static void pressImage(String targetImg, String waterImg, int x, int y, float alpha) {            try {                File file = new File(targetImg);                Image image = ImageIO.read(file);                int width = image.getWidth(null);                int height = image.getHeight(null);                BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);                Graphics2D g = bufferedImage.createGraphics();                g.drawImage(image, 0, 0, width, height, null);                Image waterImage = ImageIO.read(new File(waterImg));    // 水印文件                int width_1 = waterImage.getWidth(null);                int height_1 = waterImage.getHeight(null);                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));                                 int widthDiff = width - width_1;                int heightDiff = height - height_1;                if(x < 0){                    x = widthDiff / 2;                }else if(x > widthDiff){                    x = widthDiff;                }                if(y < 0){                    y = heightDiff / 2;                }else if(y > heightDiff){                    y = heightDiff;                }                g.drawImage(waterImage, x, y, width_1, height_1, null); // 水印文件结束                g.dispose();                ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);            } catch (IOException e) {                e.printStackTrace();            }    }     /**     * 添加文字水印     * @param targetImg 目标图片路径,如:C://myPictrue//1.jpg     * @param pressText 水印文字, 如:中国证券网     * @param fontName 字体名称,    如:宋体     * @param fontStyle 字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)     * @param fontSize 字体大小,单位为像素     * @param color 字体颜色     * @param x 水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间     * @param y 水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间     * @param alpha 透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)     */    public static void pressText(String targetImg, String pressText, String fontName, int fontStyle, int fontSize, Color color, int x, int y, float alpha) {        BufferedImage bufferedImage=null;        try {            File file = new File(targetImg);                         Image image = ImageIO.read(file);            int width = 400; //image.getWidth(null);   //update by zsy 压缩图片大小            int height = 310;//image.getHeight(null);            bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);            Graphics2D g = bufferedImage.createGraphics();            g.drawImage(image, 0, 0, width, height, null);            g.setFont(new Font(fontName, fontStyle, fontSize));            g.setColor(color);            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));                         int width_1 = fontSize * getLength(pressText);            int height_1 = fontSize;            int widthDiff = width - width_1;            int heightDiff = height - height_1;            if(x < 0){                x = widthDiff / 2;            }else if(x > widthDiff){                x = widthDiff;            }            if(y < 0){                y = heightDiff / 2;            }else if(y > heightDiff){                y = heightDiff;            }                         g.drawString(pressText, x, y + height_1);            g.dispose();            ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);        } catch (Exception e) {            e.printStackTrace();        }finally {            bufferedImage.flush();        }    }         /**     * 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符     * @param text     * @return 字符长度,如:text="中国",返回 2;text="test",返回 2;text="中国ABC",返回 4.     */    public static int getLength(String text) {        int textLength = text.length();        int length = textLength;        for (int i = 0; i < textLength; i++) {            if (String.valueOf(text.charAt(i)).getBytes().length > 1) {                length++;            }        }        return (length % 2 == 0) ? length / 2 : length / 2 + 1;    }     /**     * 图片缩放     * @param filePath 图片路径     * @param height 高度     * @param width 宽度     * @param bb 比例不对时是否需要补白     */    public static void resize(String filePath, int height, int width, boolean bb) {        try {            double ratio = 0; //缩放比例        File f = new File(filePath);        BufferedImage bi = ImageIO.read(f);        Image itemp = bi.getScaledInstance(width, height, BufferedImage.SCALE_SMOOTH);        //计算比例        if ((bi.getHeight() > height) || (bi.getWidth() > width)) {          if (bi.getHeight() > bi.getWidth()) {            ratio = (new Integer(height)).doubleValue() / bi.getHeight();          } else {            ratio = (new Integer(width)).doubleValue() / bi.getWidth();          }          AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(ratio, ratio), null);          itemp = op.filter(bi, null);        }        if (bb) {          BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);          Graphics2D g = image.createGraphics();          g.setColor(Color.white);          g.fillRect(0, 0, width, height);          if (width == itemp.getWidth(null))            g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);          else          g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0, itemp.getWidth(null), itemp.getHeight(null), Color.white, null);          g.dispose();          itemp = image;        }      ImageIO.write((BufferedImage) itemp, "jpg", f);          } catch (IOException e) {            e.printStackTrace();        }    }     public static void main(String[] args) throws IOException {        narrowAndFormateTransfer("D://empupload/emp/IMAGE/2017/8/7/201708071033346266.png","D://empupload/emp/IMAGE/2017/8/7/20170807103334621236.png",400,100,"png");       // pressImage("d://pic//4.jpg", "d://pic//test.jpg", -1, -1, 0.5f);//        pressText("d://pic//2.jpg", "旺仔之印", "宋体", Font.BOLD|Font.ITALIC, 20, Color.BLACK, 0, 0, 0.4f);       // pressText("d://pic//2.jpg", "旺仔之印", "宋体", Font.BOLD, 20, Color.RED, 0, 0, 0.7f);        //resize("d://pic//4.jpg", 1000, 500, true);    }}

二.绘制验证码图片工具类 ImageUtils:

package com.ftk.eloan.framework.utils;import java.awt.Color;import java.awt.Font;import java.awt.Graphics;import java.awt.image.BufferedImage;import java.io.File;import java.io.FileOutputStream;import java.util.Random;import javax.imageio.ImageIO;import org.springframework.util.Base64Utils;public class ImageUtils {// 随机产生的字符串private static final String RANDOM_STRS = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final String IMG_HEADER = "data:image/jpg;base64,";private static final String FONT_NAME = "Fixedsys";private static final int FONT_SIZE = 20;private Random random = new Random();private int width = 80;// 图片宽private int height = 25;// 图片高private int lineNum = 20;// 干扰线数量private int strNum = 4;// 随机产生字符数量/** * 生成随机图片 */public BufferedImage genRandomCodeImage(StringBuffer randomCode) {// BufferedImage类是具有缓冲区的Image类BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_BGR);// 获取Graphics对象,便于对图像进行各种绘制操作Graphics g = image.getGraphics();// 设置背景色// g.setColor(getRandColor(200, 250));g.setColor(new Color(240, 248, 255));g.fillRect(0, 0, width, height);// 设置干扰线的颜色g.setColor(getRandColor(110, 120));// 绘制干扰线for (int i = 0; i <= lineNum; i++) {drowLine(g);}// 绘制随机字符g.setFont(new Font(FONT_NAME, Font.ROMAN_BASELINE, FONT_SIZE));for (int i = 1; i <= strNum; i++) {randomCode.append(drowString(g, i));}g.dispose();return image;}/** * 给定范围获得随机颜色 */private Color getRandColor(int fc, int bc) {if (fc > 255)fc = 255;if (bc > 255)bc = 255;int r = fc + random.nextInt(bc - fc);int g = fc + random.nextInt(bc - fc);int b = fc + random.nextInt(bc - fc);return new Color(r, g, b);}/** * 绘制字符串 */private String drowString(Graphics g, int i) {g.setColor(Color.BLACK);String rand = String.valueOf(getRandomString(random.nextInt(RANDOM_STRS.length())));g.translate(random.nextInt(3), random.nextInt(3));g.drawString(rand, 13 * i, 16);return rand;}/** * 绘制干扰线 */private void drowLine(Graphics g) {int x = random.nextInt(width);int y = random.nextInt(height);int x0 = random.nextInt(16);int y0 = random.nextInt(16);g.drawLine(x, y, x + x0, y + y0);}/** * 获取随机的字符 */private String getRandomString(int num) {return String.valueOf(RANDOM_STRS.charAt(num));}public static String encodeImgToString(byte[] imgByte){return IMG_HEADER + Base64Utils.encodeToString(imgByte);}public static void main(String[] args) {ImageUtils tool = new ImageUtils();StringBuffer code = new StringBuffer();BufferedImage image = tool.genRandomCodeImage(code);System.out.println(">>> random code =: " + code);try {// 将内存中的图片通过流动形式输出到客户端ImageIO.write(image, "JPEG", new FileOutputStream(new File("/Users/wangchaochao/Desktop/random-code.jpg")));} catch (Exception e) {e.printStackTrace();}}}


原创粉丝点击