Java 图片添加水印

SpringBoot 专栏收录该内容
8 篇文章 0 订阅

图片添加水印效果:

 

创建工具类:ImageMarkLogoByIcon 类,直接调用ImgWatermark方法传入要加水印的图片位置和加完水印图片存储位置,样式透明度啥自己设置一下

package com.toolUtils;


import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;


/**
 * 图片水印Demo
 *
 * @author thinkpad
 */
public class ImageMarkLogoByIcon {




  /**
     * 给图片添加水印
     * @param FilePath   源图片路径
     * @param imgWatermarkSrc 水印图片路径
     */
    public static void ImgWatermark(String FilePath, String imgWatermarkSrc) {
        //水印字符串
        String waterMarkContent = "水印水印";
        //水印图片色彩以及透明度
        Color color = new Color(255, 255, 255, 50);
        //水印字体类型
        Font font = new Font("微软雅黑", Font.PLAIN, 45);
        addTextWaterMark(FilePath, imgWatermarkSrc, waterMarkContent, color, font);
    }




    /**
     * 给图片添加水印
     *
     * @param iconPath   水印图片路径
     * @param srcImgPath 源图片路径
     * @param targerPath 目标图片路径
     */
    public static void markImageByIcon(String iconPath, String srcImgPath,
                                       String targerPath) {
        markImageByIcon(iconPath, srcImgPath, targerPath, null);
    }

    /**
     * 给图片添加水印、可设置水印图片旋转角度
     *
     * @param iconPath   水印图片路径
     * @param srcImgPath 源图片路径
     * @param targerPath 目标图片路径
     * @param degree     水印图片旋转角度
     */
    public static void markImageByIcon(String iconPath, String srcImgPath,
                                       String targerPath, Integer degree) {
        OutputStream os = null;
        try {
            Image srcImg = ImageIO.read(new File(srcImgPath));

            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
                    srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

            // 得到画笔对象
            // Graphics g= buffImg.getGraphics();
            Graphics2D g = buffImg.createGraphics();

            // 设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
                    RenderingHints.VALUE_INTERPOLATION_BILINEAR);

            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg
                    .getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);

            if (null != degree) {
                // 设置水印旋转
                g.rotate(Math.toRadians(degree),
                        (double) buffImg.getWidth() / 2, (double) buffImg
                                .getHeight() / 2);
            }

            // 水印图象的路径 水印一般为gif或者png的,这样可设置透明度
            ImageIcon imgIcon = new ImageIcon(iconPath);
            // 得到Image对象。
            Image img = imgIcon.getImage();
            // float alpha = 0.5f; // 透明度  (数值越大,透明度越小)
            float alpha = 1f; // 透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));

            // 表示水印图片的位置
            int iconWidth = img.getWidth(null); //水印图片宽度
            int iconHeight = img.getHeight(null);  //水印图片高度
            // g.drawImage(img, 水印位置的横坐标, 水印位置的纵坐标,水印宽度, 水印高度, null);
            g.drawImage(img, buffImg.getWidth() - iconWidth, buffImg.getHeight() - iconHeight,
                    iconWidth, iconHeight, null);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            g.dispose();
            os = new FileOutputStream(targerPath);
            // 生成图片
            ImageIO.write(buffImg, "png", os);
            System.out.println("图片完成添加Icon印章。。。。。。");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }


    /**
     * 给图片添加文字水印
     *
     * @param srcImgPath       源图片路径
     * @param tarImgPath       保存的图片路径
     * @param waterMarkContent 水印内容
     * @param markContentColor 水印颜色
     * @param font             水印字体
     */
    public static void addTextWaterMark(String srcImgPath, String tarImgPath, String waterMarkContent, Color markContentColor, Font font) {

        try {
            // 读取原图片信息
            File srcImgFile = new File(srcImgPath);//得到文件
            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.setColor(markContentColor); //根据图片的背景设置水印颜色
            g.setFont(font);              //设置字体

            AffineTransform affineTransform = new AffineTransform();
            affineTransform.rotate(Math.toRadians(45), 0, 0);
            Font rotatedFont = font.deriveFont(affineTransform);
            g.setFont(rotatedFont);


            //设置水印的坐标
//            int x = srcImgWidth - 2 * getWatermarkLength(waterMarkContent, g);
//            int y = srcImgHeight - getWatermarkLength(waterMarkContent, g);
//            System.out.println("源图宽度:"+srcImgWidth+"   ,高度:"+srcImgHeight);
//            System.out.println("水印宽度:"+getWatermarkLength(waterMarkContent, g)+"   ,高度:"+getWatermarkLength(waterMarkContent, g));
//            System.out.println("水印坐标的X轴:"+x+"   ,Y轴:"+y);

//            水印宽度
            int waterWidth = getWatermarkLength(waterMarkContent, g) * 3;
//            水印高度
            int waterHeight = getWatermarkLength(waterMarkContent, g) * 3;

            //获取xy轴循环次数
            int xNum = srcImgWidth / getWatermarkLength(waterMarkContent, g);
            int YNum = srcImgHeight / getWatermarkLength(waterMarkContent, g);

//            X轴循环
            for (int i = 0; i < xNum; i++) {
                if (i == 0) {
                    g.drawString(waterMarkContent, 0, 0);
                    //            Y轴循环
                    for (int n = 1; n < YNum; n++) {
                        int yyn = waterHeight * n;
                        g.drawString(waterMarkContent, 0, yyn);  //画出水印
                    }
                }
                if (i != 0) {
                    int xx = waterWidth * i;
                    int yy = 0;
                    g.drawString(waterMarkContent, xx, yy);  //画出水印
                    for (int n = 1; n < YNum; n++) {
                        int yyn = waterHeight * n;
                        g.drawString(waterMarkContent, xx, yyn);  //画出水印
                    }
                }
            }

            g.dispose();
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "jpg", outImgStream);
//            System.out.println("添加水印完成");
            outImgStream.flush();
            outImgStream.close();

        } catch (Exception e) {
            // TODO: handle exception
        }
    }
    
    public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
    }


}

 

 

 

 

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值