Java实现给图片添加水印工具类

发布时间:2023年12月18日
import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.JLabel;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * @author Lin
 * @date 2018-06-28
 * @description 水印工具类
 */
public class WaterMarkUtils {

   private static Logger logger = LoggerFactory.getLogger(WaterMarkUtils.class);

   /**
    * @param sourceImgPath
    * @param tarImgPath
    * @param waterMarkContent
    * @date 2018-06-28
    * @author Lin
    * @description 添加水印
    */
   public static void addWaterMark(String sourceImgPath, String tarImgPath, String waterMarkContent) throws Exception {
      addWaterMark(sourceImgPath, tarImgPath, waterMarkContent, "png");
   }

   /**
    * @date 2018-06-28
    * @author Lin
    * @description 添加水印
    * @param sourceImgPath 源图片路径
    * @param tarImgPath 保存的图片路径
    * @param waterMarkContent 水印内容
    * @param fileExt 图片格式
    * @return void
    */

   /**
    * @param sourceImgPath    源图片路径
    * @param tarImgPath       保存的图片路径
    * @param waterMarkContent 水印内容
    * @param fileExt          图片格式
    * @return void
    * @date 2018-06-28
    * @author Lin
    * @description 添加水印
    */
   public static void addWaterMark(String sourceImgPath, String tarImgPath,
                           String waterMarkContent, String fileExt) throws Exception {
      Font font = new Font("微软雅黑", Font.PLAIN, 20);// 水印字体,大小
      Color markContentColor = Color.black;// 水印颜色
      Integer degree = -45;// 设置水印文字的旋转角度
      float alpha = 0.4f;// 设置水印透明度
      OutputStream outImgStream = null;
      try {
         File srcImgFile = new File(sourceImgPath);// 得到文件
         Image srcImg = ImageIO.read(srcImgFile);// 文件转化为图片
         int srcImgWidth = srcImg.getWidth(null);// 获取图片的宽
         int srcImgHeight = srcImg.getHeight(null);// 获取图片的高
         // 加水印
         BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight,
            BufferedImage.TYPE_INT_RGB);
         Graphics2D g = bufImg.createGraphics();// 得到画笔
         g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
         // g.drawImage(srcImg, 0, -srcImgHeight, srcImgWidth, 0, null);
         g.setColor(markContentColor); // 设置水印颜色
         g.setFont(font); // 设置字体
         g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
            alpha));// 设置水印文字透明度
         if (null != degree) {
            double dd = Math.toRadians(degree);
            g.rotate(Math.toRadians(degree));// 设置水印旋转
            // g.rotate(Math.toRadians(degree), x, y)
         }
         JLabel label = new JLabel(waterMarkContent);
         FontMetrics metrics = label.getFontMetrics(font);
         int width = metrics.stringWidth(label.getText());// 文字水印的宽
         width = width + 60;// 2倍宽度
         int rowsNumber = (srcImgHeight + srcImgHeight / 2) / width;// 图片的高
         // 除以
         // 文字水印的宽
         // ——>
         // 打印的行数(以文字水印的宽为间隔)
         int columnsNumber = (srcImgWidth + srcImgWidth / 2) * 2 / width;// 图片的宽
         // 除以
         // 文字水印的宽
         // ——>
         // 每行打印的列数(以文字水印的宽为间隔)
         // 防止图片太小而文字水印太长,所以至少打印一次
         if (rowsNumber < 1) {
            rowsNumber = 1;
         }
         if (columnsNumber < 1) {
            columnsNumber = 1;
         }
         for (int j = 0; j < rowsNumber + 2; j++) {
            for (int i = 0; i < columnsNumber + 2; i++) {
               // 45度
               // g.drawString(waterMarkContent, i*width + j*width,
               // -i*width + j*width);//画出水印,并设置水印位置
               // -45度
               int x = width + i * width - j * width + 80;
               int y = -width + i * width + j * width - 30;
//             System.out.println(x + ":" + y);
               g.drawString(waterMarkContent, x, y);// 画出水印,并设置水印位置
               // System.out.println((width + i*width - j*width - 90) + ":"
               // + (-width + i*width + j*width));
            }
         }
         g.dispose();// 释放资源
         // 输出图片
         outImgStream = new FileOutputStream(tarImgPath);
         ImageIO.write(bufImg, fileExt, outImgStream);
      } catch (Exception e) {
         logger.info("图片添加水印失败sourceImgPath:" + sourceImgPath);
         e.printStackTrace();
         e.getMessage();
      } finally {
         try {
            if (outImgStream != null) {
               outImgStream.flush();
               outImgStream.close();
            }
         } catch (Exception e) {
            e.printStackTrace();
            e.getMessage();
         }
      }
   }
}

调用例子:

WaterMarkUtils.addWaterMark("C:\\Users\\hohe\\Pictures\\自我介绍.png", "C:\\Users\\hohe\\Pictures\\自我介绍1.png", "请点赞收藏");

实现效果:

文章来源:https://blog.csdn.net/qq_39564789/article/details/135068252
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。