对图片添加水印

同样类似对pdf文件添加水印,但是使用的技术不一样。代码如下:

  1 import org.slf4j.Logger;
  2 import org.slf4j.LoggerFactory;
  3 
  4 import javax.imageio.ImageIO;
  5 import javax.swing.*;
  6 import java.awt.*;
  7 import java.awt.image.BufferedImage;
  8 import java.io.*;
  9 
 10 /**
 11  * 图片套印工具类
 12  * @author limingcheng
 13  *
 14  */
 15 public class PicUtils {
 16    
 17    private final static Logger LOGGER = LoggerFactory.getLogger(PdfUtils.class);
 18    
 19    /**
 20      * @description 给图片平铺添加水印
 21      * @param sourceImgPath 源图片路径
 22      * @param tarImgPath 保存的图片路径
 23      * @param waterMarkContent 水印内容
 24      * @param fileExt 图片格式
 25      * @return void
 26      */
 27     public void addWatermarkTile(String sourceImgPath, String tarImgPath, String waterMarkContent, String fileExt){
 28         Font font = new Font("宋体", Font.BOLD, 24);//水印字体,大小
 29         Color markContentColor = Color.white;//水印颜色
 30         Integer degree = -45;//设置水印文字的旋转角度
 31         float alpha = 1.0f;//设置水印透明度 默认为1.0  值越小颜色越浅
 32         OutputStream outImgStream = null;
 33         try {
 34             File srcImgFile = new File(sourceImgPath);//得到文件
 35             Image srcImg = ImageIO.read(srcImgFile);//文件转化为图片
 36             int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
 37             int srcImgHeight = srcImg.getHeight(null);//获取图片的高
 38             // 加水印
 39             BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
 40             Graphics2D g = bufImg.createGraphics();//得到画笔
 41             g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
 42             g.setColor(markContentColor); //设置水印颜色
 43             g.setFont(font);              //设置字体
 44             g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度
 45             if (null != degree) {
 46                 g.rotate(Math.toRadians(degree),(double)bufImg.getWidth(),(double)bufImg.getHeight());//设置水印旋转
 47             }
 48             JLabel label = new JLabel(waterMarkContent);
 49             FontMetrics metrics = label.getFontMetrics(font);
 50             int width = metrics.stringWidth(label.getText());//文字水印的宽
 51             int rowsNumber = srcImgHeight/width+srcImgHeight%width;// 图片的高  除以  文字水印的宽  打印的行数(以文字水印的宽为间隔)
 52             int columnsNumber = srcImgWidth/width+srcImgWidth%width;//图片的宽 除以 文字水印的宽  每行打印的列数(以文字水印的宽为间隔)
 53             //防止图片太小而文字水印太长,所以至少打印一次
 54             if(rowsNumber < 1){
 55                 rowsNumber = 1;
 56             }
 57             if(columnsNumber < 1){
 58                 columnsNumber = 1;
 59             }
 60             for(int j=0;j<rowsNumber;j++){
 61                 for(int i=0;i<columnsNumber;i++){
 62                     g.drawString(waterMarkContent, i*width + j*width, -i*width + j*width);//画出水印,并设置水印位置
 63                 }
 64             }
 65             g.dispose();// 释放资源
 66             // 输出图片  
 67             outImgStream = new FileOutputStream(tarImgPath);
 68             ImageIO.write(bufImg, fileExt, outImgStream);
 69         } catch (Exception e) {
 70             e.printStackTrace();
 71             e.getMessage();
 72         } finally{
 73             try {
 74                 if(outImgStream != null){
 75                     outImgStream.flush();
 76                     outImgStream.close();
 77                 }
 78             } catch (Exception e) {
 79                 e.printStackTrace();
 80                 e.getMessage();
 81             }
 82         }
 83     }
 84    
 85     /**
 86      * 在图片中间添加文字水印
 87      * @param imgIS
 88      * @param imgOS
 89      * @param textContent
 90      * @param fileType
 91      */
 92     public void addWatermarkCenter(InputStream imgIS, OutputStream imgOS, String textContent, String fileType){
 93         
 94         Color markContentColor = Color.GRAY;//水印颜色
 95         Integer degree = 45;//设置水印文字的旋转角度
 96         float alpha = 0.5f;//设置水印透明度 默认为1.0  值越小颜色越浅
 97         try {
 98             Image srcImg = ImageIO.read(imgIS);    //文件转化为图片
 99             int srcImgWidth = srcImg.getWidth(null);//获取图片的宽
100             int srcImgHeight = srcImg.getHeight(null);//获取图片的高
101             int fontSize = (srcImgWidth*3)/40;
102             Font font = new Font("宋体", Font.BOLD, fontSize);//水印字体,大小
103             // 加水印
104             BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
105             Graphics2D g2d = bufImg.createGraphics();//得到画笔
106             g2d.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
107             g2d.setColor(markContentColor); //设置水印颜色
108             g2d.setFont(font);              //设置字体
109             g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));//设置水印文字透明度
110             
111             g2d.rotate(Math.toRadians(degree),srcImgWidth/5,srcImgHeight/5);//设置水印旋转
112             g2d.drawString(textContent, srcImgWidth/5,srcImgHeight/5);//画出水印,并设置水印位置
113             g2d.dispose();// 释放资源
114             // 输出图片  
115             ImageIO.write(bufImg, fileType, imgOS);
116         } catch (Exception e) {
117             e.printStackTrace();
118             e.getMessage();
119         } finally{
120            
121         }
122     }
123    
124     public static void main(String[] args) throws FileNotFoundException {
125        InputStream imgIS = null;
126        OutputStream imgOS = null;
127         try {
128            File inFile = new File("E:/图片/c43e0f5accb56db2cd75f1e6c6071902.jpg");
129             File outFile = new File("E:/图片/test007.jpg");
130             imgIS = new FileInputStream(inFile);
131             imgOS = new FileOutputStream(outFile);
132             new PicUtils().addWatermarkCenter(imgIS, imgOS, "内部使用,仅供查看", "jpg");
133 
134       } catch (IOException e) {
135          e.printStackTrace();
136       } finally {
137          try {
138             if(imgIS != null) {
139                imgIS.close();
140             }
141          } catch (IOException e) {
142             e.printStackTrace();
143          }
144          try {
145             if(imgOS != null) {
146                imgOS.close();
147             }
148          } catch (IOException e) {
149             e.printStackTrace();
150          }
151       }
152         
153     }
154    
155    
156 }

效果如下:

原文地址:https://www.cnblogs.com/bestlmc/p/12012892.html