• java实现给图片添加水印(文字水印或图片水印)


    本文介绍java实现在图片上加文字水印的方法,水印可以是图片或者文字,操作方便。

    java实现给图片添加水印实现步骤:
    (1)获取原图片对象信息(本地图片或网络图片)
    (2)添加水印(设置水印颜色、字体、坐标等)
    (3)处理输出目标图片

    一、java实现给图片添加文字水印

    1.获取原图片对象信息

    第一步:获取需要处理的图片

    获取图片的方式,通常由两种:

    1. 一种是通过下载到本地,从本地读取(本地图片);

    2. 另外一种是通过网络地址进行读取(网络图片)

    1.1 读取本地图片

    在这里插入图片描述
    通过代码实现读取本地目录(F:\image\1.png)下图片,代码如下:

    // 读取原图片信息 得到文件
    File srcImgFile = new File("F:/image/1.png");
    //将文件对象转化为图片对象
    Image srcImg = ImageIO.read(srcImgFile);
    //获取图片的宽
    int srcImgWidth = srcImg.getWidth(null);
    //获取图片的高
    int srcImgHeight = srcImg.getHeight(null);
    System.out.println("图片的宽:"+srcImgWidth);
    System.out.println("图片的高:"+srcImgHeight);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    代码效果如下:
    在这里插入图片描述

    1.2 读取网络图片

    //创建一个URL对象,获取网络图片的地址信息
    URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
    //将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
    Image srcImg = ImageIO.read(url.openStream());
    //获取图片的宽
    int srcImgWidth = srcImg.getWidth(null);
    //获取图片的高
    int srcImgHeight = srcImg.getHeight(null);
    System.out.println("图片的宽:"+srcImgWidth);
    System.out.println("图片的高:"+srcImgHeight);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    代码效果如下:
    在这里插入图片描述

    2.添加水印

    通过上面的步骤,我们已经获取到了原始图片信息,下面需要创建一个画笔进行水印的添加。水印包含文字水印、图片水印。

    画笔可以设置水印颜色、字体大小、字体样式等。

    BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
    // 加水印
    //创建画笔
    Graphics2D g = bufImg.createGraphics();
    //srcImg 为上面获取到的原始图片的图片对象
    g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
    //根据图片的背景设置水印颜色
    g.setColor(new Color(255,255,255,128));
    //设置字体  画笔字体样式为微软雅黑,加粗,文字大小为60pt
    g.setFont(new Font("微软雅黑", Font.BOLD, 60));
    //设置水印的坐标
    //int x=200;
    //int y=200;
    int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
    int y=srcImgHeight / 2;
    //画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
    g.drawString("图片来源:https://image.baidu.com/", x, y);
    g.dispose();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    getWatermarkLength方法用于计算水印内容的长度

        /**
         * 获取水印文字的长度
         * @param waterMarkContent
         * @param g
         * @return
         */
        public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
            return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    Font 字体说明:

    Font 类的构造函数为: public Font(String familyName, int style, int size)
    参数说明:第一个参数为字体类型,第二个参数为字体风格,第三个参数为字体大小

    字体的风格有:

    • Font.PLAIN(普通)
    • Font.BOLD(加粗)
    • Font.ITALIC(斜体)
    • Font.BOLD+Font.ITALIC(粗斜体)

    size字体大小 默认单位是pt(磅),数字越大,字就越大

    需要注意是 水印坐标位置。设置不当,就看不到水印效果。

    如何确定水印位置 ?
    方法一:设置固定值

    ①首先,我们要知道图片上的坐标的表示法。具体如下:
    在这里插入图片描述
    ②将图片保存到本地,然后选中图片点击右键,编辑,选择“画图”软件打开
    在这里插入图片描述
    ③将鼠标移动到想要添加水印的位置,左下角可以看到鼠标点击位置对应的坐标值,拿到这个坐标值写入程序即可
    在这里插入图片描述
    方法二:根据原图大小进行设置,如放置在原图的中间位置
    x轴坐标:(原始图的宽度 - 水印的宽度) / 2
    y轴坐标:(原始图的高度 - 水印的高度) / 2

    3.获取目标图片

    经过上面的操作后,我们的图片添加文字就已经处理完成了。但他现在还保存在Java对象中。
    我们想要看得到效果,需要进行处理,保存图片到本地。

    //待存储的地址
    String tarImgPath="F:/image/t.png";
    // 输出图片
    FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
    ImageIO.write(bufImg, "png", outImgStream);
    System.out.println("添加水印完成");
    outImgStream.flush();
    outImgStream.close();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    执行效果:
    执行,目标目录下多了一个t.png的图片:
    在这里插入图片描述

    t.png打开可以看到添加的文字水印,水印添加成功:
    在这里插入图片描述

    4.完成代码

    package com.example.listdemo.utils;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * 图片添加水印
     * @author qzz
     */
    public class ImageUtils {
    
        public static void main(String[] args) throws IOException {
            // 读取原图片信息 得到文件(本地图片)
            File srcImgFile = new File("F:/image/1.png");
            //将文件对象转化为图片对象
            Image srcImg = ImageIO.read(srcImgFile);
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);
            System.out.println("图片的宽:"+srcImgWidth);
            System.out.println("图片的高:"+srcImgHeight);
    
            //创建一个URL对象,获取网络图片的地址信息(网络图片)
    //        URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
    //        //将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
    //        Image srcImg = ImageIO.read(url.openStream());
    //        //获取图片的宽
    //        int srcImgWidth = srcImg.getWidth(null);
    //        //获取图片的高
    //        int srcImgHeight = srcImg.getHeight(null);
    //        System.out.println("图片的宽:"+srcImgWidth);
    //        System.out.println("图片的高:"+srcImgHeight);
    
    
    
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 加水印
            //创建画笔
            Graphics2D g = bufImg.createGraphics();
            //绘制原始图片
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //-------------------------文字水印 start----------------------------
            //根据图片的背景设置水印颜色
            g.setColor(new Color(255,255,255,128));
            //设置字体  画笔字体样式为微软雅黑,加粗,文字大小为60pt
            g.setFont(new Font("微软雅黑", Font.BOLD, 60));
            //水印内容
            String waterMarkContent="图片来源:https://image.baidu.com/";
            //设置水印的坐标(为原图片中间位置)
            int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
            int y=srcImgHeight / 2;
            //画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
            g.drawString(waterMarkContent, x, y);
            g.dispose();
            //-------------------------文字水印 end----------------------------
            //待存储的地址
            String tarImgPath="F:/image/t.png";
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "png", outImgStream);
            System.out.println("添加水印完成");
            outImgStream.flush();
            outImgStream.close();
    
        }
        
        /**
         * 获取水印文字的长度
         * @param waterMarkContent
         * @param g
         * @return
         */
        public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
            return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83

    二、java实现给图片添加图片水印

    下载水印图片到本地:
    水印图片位置:F:\image\s.png
    在这里插入图片描述

    1.添加图片水印方法:

    // 水印文件
    String waterMarkImage="F:/image/s.png";
    Image srcWaterMark = ImageIO.read(new File(waterMarkImage));
    //获取水印图片的宽度
    int widthWaterMark= srcWaterMark.getWidth(null);
    //获取水印图片的高度
    int heightWaterMark = srcWaterMark.getHeight(null);
    //设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
    g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
    //绘制水印图片  坐标为中间位置
    g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,
            (srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);
    // 水印文件结束
    g.dispose();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    2.完成代码

    package com.example.listdemo.utils;
    
    import javax.imageio.ImageIO;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    /**
     * 图片添加水印
     * @author qzz
     */
    public class ImageUtils {
    
        public static void main(String[] args) throws IOException {
            // 读取原图片信息 得到文件(本地图片)
            File srcImgFile = new File("F:/image/1.png");
            //将文件对象转化为图片对象
            Image srcImg = ImageIO.read(srcImgFile);
            //获取图片的宽
            int srcImgWidth = srcImg.getWidth(null);
            //获取图片的高
            int srcImgHeight = srcImg.getHeight(null);
            System.out.println("图片的宽:"+srcImgWidth);
            System.out.println("图片的高:"+srcImgHeight);
    
            //创建一个URL对象,获取网络图片的地址信息(网络图片)
    //        URL url = new URL("https://pngimg.com/distr/img/ukraine.png");
    //        //将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)
    //        Image srcImg = ImageIO.read(url.openStream());
    //        //获取图片的宽
    //        int srcImgWidth = srcImg.getWidth(null);
    //        //获取图片的高
    //        int srcImgHeight = srcImg.getHeight(null);
    //        System.out.println("图片的宽:"+srcImgWidth);
    //        System.out.println("图片的高:"+srcImgHeight);
    
    
    
            BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
            // 加水印
            //创建画笔
            Graphics2D g = bufImg.createGraphics();
            //绘制原始图片
            g.drawImage(srcImg, 0, 0, srcImgWidth, srcImgHeight, null);
            //-------------------------文字水印 start----------------------------
    //        //根据图片的背景设置水印颜色
    //        g.setColor(new Color(255,255,255,128));
    //        //设置字体  画笔字体样式为微软雅黑,加粗,文字大小为60pt
    //        g.setFont(new Font("微软雅黑", Font.BOLD, 60));
    //        String waterMarkContent="图片来源:https://image.baidu.com/";
    //        //设置水印的坐标(为原图片中间位置)
    //        int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
    //        int y=srcImgHeight / 2;
    //        //画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
    //        g.drawString(waterMarkContent, x, y);
    //        g.dispose();
            //-------------------------文字水印 end----------------------------
    
            //-------------------------图片水印 start----------------------------
            // 水印文件
            String waterMarkImage="F:/image/s.png";
            Image srcWaterMark = ImageIO.read(new File(waterMarkImage));
            //获取水印图片的宽度
            int widthWaterMark= srcWaterMark.getWidth(null);
            //获取水印图片的高度
            int heightWaterMark = srcWaterMark.getHeight(null);
            //设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));
            //绘制水印图片  坐标为中间位置
            g.drawImage(srcWaterMark, (srcImgWidth - widthWaterMark) / 2,
                    (srcImgHeight - heightWaterMark) / 2, widthWaterMark, heightWaterMark, null);
            // 水印文件结束
            g.dispose();
            //-------------------------图片水印 end----------------------------
    
            //待存储的地址
            String tarImgPath="F:/image/t.png";
            // 输出图片
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(bufImg, "png", outImgStream);
            System.out.println("添加水印完成");
            outImgStream.flush();
            outImgStream.close();
    
        }
        
        /**
         * 获取水印文字的长度
         * @param waterMarkContent
         * @param g
         * @return
         */
        public static int getWatermarkLength(String waterMarkContent, Graphics2D g) {
            return g.getFontMetrics(g.getFont()).charsWidth(waterMarkContent.toCharArray(), 0, waterMarkContent.length());
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99

    3.代码执行效果

    在这里插入图片描述
    t.png图片文件中 含有 水印图片,说明 图片水印添加成功!

  • 相关阅读:
    【LeetCode刷题(数据结构与算法)】:二叉树的中序遍历
    Docker Tutorial
    ubuntu安装openresty
    【linux高性能服务器编程】中篇
    【数据结构】二叉树的基本概念
    使用VSCode中遇到的问题及解决办法
    Vue 快速入门之第四章 路由
    4---Linux:gcc,g++编译/制作并调用静态库,动态库/makefile
    牛客题目——买卖股票的最好时机(一)、(二)、(三)、设计LRU缓存结构
    FPGA刷题——信号发生器+冒泡法求6个数中的最小值
  • 原文地址:https://blog.csdn.net/qq_26383975/article/details/125996277