• Java水印图片处理


    今天需要用Java程序给图片加水印,于是在网上找到了一段代码,感觉很好,于是记录了下来,原来的网址给忘了:

      1 import java.awt.AlphaComposite;
      2 import java.awt.Color;
      3 import java.awt.Font;
      4 import java.awt.Graphics2D;
      5 import java.awt.Image;
      6 import java.awt.geom.AffineTransform;
      7 import java.awt.image.AffineTransformOp;
      8 import java.awt.image.BufferedImage;
      9 import java.io.File;
     10 import java.io.IOException;
     11 
     12 import javax.imageio.ImageIO;
     13 
     14 /**
     15  * 图片工具类, 图片水印,文字水印,缩放,补白等
     16  * 
     17  * @author Carl He
     18  */
     19 public final class ImageUtils {
     20     /** 图片格式:JPG */
     21     private static final String PICTRUE_FORMATE_JPG = "jpg";
     22 
     23     private ImageUtils() {
     24     }
     25 
     26     /**
     27      * 添加图片水印
     28      * 
     29      * @param targetImg
     30      *            目标图片路径,如:C://myPictrue//1.jpg
     31      * @param waterImg
     32      *            水印图片路径,如:C://myPictrue//logo.png
     33      * @param x
     34      *            水印图片距离目标图片左侧的偏移量,如果x<0, 则在正中间
     35      * @param y
     36      *            水印图片距离目标图片上侧的偏移量,如果y<0, 则在正中间
     37      * @param alpha
     38      *            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
     39      */
     40     public final static void pressImage(String targetImg, String waterImg,
     41             int x, int y, float alpha) {
     42         try {
     43             File file = new File(targetImg);
     44             Image image = ImageIO.read(file);
     45             int width = image.getWidth(null);
     46             int height = image.getHeight(null);
     47             BufferedImage bufferedImage = new BufferedImage(width, height,
     48                     BufferedImage.TYPE_INT_RGB);
     49             Graphics2D g = bufferedImage.createGraphics();
     50             g.drawImage(image, 0, 0, width, height, null);
     51 
     52             Image waterImage = ImageIO.read(new File(waterImg)); // 水印文件
     53             int width_1 = waterImage.getWidth(null);
     54             int height_1 = waterImage.getHeight(null);
     55             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
     56                     alpha));
     57 
     58             int widthDiff = width - width_1;
     59             int heightDiff = height - height_1;
     60             if (x < 0) {
     61                 x = widthDiff / 2;
     62             } else if (x > widthDiff) {
     63                 x = widthDiff;
     64             }
     65             if (y < 0) {
     66                 y = heightDiff / 2;
     67             } else if (y > heightDiff) {
     68                 y = heightDiff;
     69             }
     70             g.drawImage(waterImage, x, y, width_1, height_1, null); // 水印文件结束
     71             g.dispose();
     72             ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);
     73         } catch (IOException e) {
     74             e.printStackTrace();
     75         }
     76     }
     77 
     78     /**
     79      * 添加文字水印
     80      * 
     81      * @param targetImg
     82      *            目标图片路径,如:C://myPictrue//1.jpg
     83      * @param pressText
     84      *            水印文字, 如:中国证券网
     85      * @param fontName
     86      *            字体名称, 如:宋体
     87      * @param fontStyle
     88      *            字体样式,如:粗体和斜体(Font.BOLD|Font.ITALIC)
     89      * @param fontSize
     90      *            字体大小,单位为像素
     91      * @param color
     92      *            字体颜色
     93      * @param x
     94      *            水印文字距离目标图片左侧的偏移量,如果x<0, 则在正中间
     95      * @param y
     96      *            水印文字距离目标图片上侧的偏移量,如果y<0, 则在正中间
     97      * @param alpha
     98      *            透明度(0.0 -- 1.0, 0.0为完全透明,1.0为完全不透明)
     99      */
    100     public static void pressText(String targetImg, String pressText,
    101             String fontName, int fontStyle, int fontSize, Color color, int x,
    102             int y, float alpha) {
    103         try {
    104             File file = new File(targetImg);
    105 
    106             Image image = ImageIO.read(file);
    107             int width = image.getWidth(null);
    108             int height = image.getHeight(null);
    109             BufferedImage bufferedImage = new BufferedImage(width, height,
    110                     BufferedImage.TYPE_INT_RGB);
    111             Graphics2D g = bufferedImage.createGraphics();
    112             g.drawImage(image, 0, 0, width, height, null);
    113             g.setFont(new Font(fontName, fontStyle, fontSize));
    114             g.setColor(color);
    115             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
    116                     alpha));
    117 
    118             int width_1 = fontSize * getLength(pressText);
    119             int height_1 = fontSize;
    120             int widthDiff = width - width_1;
    121             int heightDiff = height - height_1;
    122             if (x < 0) {
    123                 x = widthDiff / 2;
    124             } else if (x > widthDiff) {
    125                 x = widthDiff;
    126             }
    127             if (y < 0) {
    128                 y = heightDiff / 2;
    129             } else if (y > heightDiff) {
    130                 y = heightDiff;
    131             }
    132 
    133             g.drawString(pressText, x, y + height_1);
    134             g.dispose();
    135             ImageIO.write(bufferedImage, PICTRUE_FORMATE_JPG, file);
    136         } catch (Exception e) {
    137             e.printStackTrace();
    138         }
    139     }
    140 
    141     /**
    142      * 获取字符长度,一个汉字作为 1 个字符, 一个英文字母作为 0.5 个字符
    143      * 
    144      * @param text
    145      * @return 字符长度,如:text="中国",返回 2;text="test",返回 2;text="中国ABC",返回 4.
    146      */
    147     public static int getLength(String text) {
    148         int textLength = text.length();
    149         int length = textLength;
    150         for (int i = 0; i < textLength; i++) {
    151             if (String.valueOf(text.charAt(i)).getBytes().length > 1) {
    152                 length++;
    153             }
    154         }
    155         return (length % 2 == 0) ? length / 2 : length / 2 + 1;
    156     }
    157 
    158     /**
    159      * 图片缩放
    160      * 
    161      * @param filePath
    162      *            图片路径
    163      * @param height
    164      *            高度
    165      * @param width
    166      *            宽度
    167      * @param bb
    168      *            比例不对时是否需要补白
    169      */
    170     public static void resize(String filePath, int height, int width, boolean bb) {
    171         try {
    172             double ratio = 0; // 缩放比例
    173             File f = new File(filePath);
    174             BufferedImage bi = ImageIO.read(f);
    175             Image itemp = bi.getScaledInstance(width, height,
    176                     BufferedImage.SCALE_SMOOTH);
    177             // 计算比例
    178             if ((bi.getHeight() > height) || (bi.getWidth() > width)) {
    179                 if (bi.getHeight() > bi.getWidth()) {
    180                     ratio = (new Integer(height)).doubleValue()
    181                             / bi.getHeight();
    182                 } else {
    183                     ratio = (new Integer(width)).doubleValue() / bi.getWidth();
    184                 }
    185                 AffineTransformOp op = new AffineTransformOp(
    186                         AffineTransform.getScaleInstance(ratio, ratio), null);
    187                 itemp = op.filter(bi, null);
    188             }
    189             if (bb) {
    190                 BufferedImage image = new BufferedImage(width, height,
    191                         BufferedImage.TYPE_INT_RGB);
    192                 Graphics2D g = image.createGraphics();
    193                 g.setColor(Color.white);
    194                 g.fillRect(0, 0, width, height);
    195                 if (width == itemp.getWidth(null))
    196                     g.drawImage(itemp, 0, (height - itemp.getHeight(null)) / 2,
    197                             itemp.getWidth(null), itemp.getHeight(null),
    198                             Color.white, null);
    199                 else
    200                     g.drawImage(itemp, (width - itemp.getWidth(null)) / 2, 0,
    201                             itemp.getWidth(null), itemp.getHeight(null),
    202                             Color.white, null);
    203                 g.dispose();
    204                 itemp = image;
    205             }
    206             ImageIO.write((BufferedImage) itemp, "jpg", f);
    207         } catch (IOException e) {
    208             e.printStackTrace();
    209         }
    210     }
    211 
    212     public static void main(String[] args) throws IOException {
    213         pressImage("C://pic//jpg", "C://pic//test.gif", 5000, 5000, 0f);
    214         pressText("C://pic//jpg", "旺仔之印", "宋体", Font.BOLD | Font.ITALIC, 20,
    215                 Color.BLACK, 0, 0, 8f);
    216         resize("C://pic//4.jpg", 1000, 500, true);
    217     }
    218 }
  • 相关阅读:
    PHP函数utf8转gb2312编码
    mysql的数据恢复
    Centos5.6 x86下部署安装DRBD+Heartbeat+MySQL
    使用mysqlproxy 快速实现mysql 集群 读写分离
    删除MySQL二进制日志的3种方法
    mysql proxy 中文乱码解决办法
    有一天……
    占个位子
    雪夜拾到一部破旧的手机
    书教得再好也还是个讲师 学生千篇文悼大学讲师
  • 原文地址:https://www.cnblogs.com/andysd/p/3552367.html
Copyright © 2020-2023  润新知