• 对图片添加水印


    同样类似对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 }

    效果如下:

  • 相关阅读:
    rabbitmq报错:not_a_dets_file,"/var/lib/rabbitmq/mnesia/rabbit@Sfabrici-Demo01/recovery.dets"的解决办法
    ubuntu18上关闭默认的防火墙
    《GCD宣言》全文
    springboot日志配置
    springboot打jar包【我】
    MongoDB 4.2 用户管理
    【短道速滑四】Halcon的texture_laws算子自我研究
    Android集合之SparseArray、ArrayMap详解
    浅析微信支付:下载对账单和资金账单
    学习如修行
  • 原文地址:https://www.cnblogs.com/bestlmc/p/12012892.html
Copyright © 2020-2023  润新知