Java实现添加文字水印、图片水印功能实战

2023-09-20 17:42:36

Java实现添加文字水印、图片水印功能实战

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

java实现给图片添加水印实现步骤:

  • 获取原图片对象信息(本地图片或网络图片)
  • 添加水印(设置水印颜色、字体、坐标等)
  • 处理输出目标图片

1.java实现给图片添加文字水印

1.1获取原图片对象信息

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

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

  • 一种是通过下载到本地,从本地读取(本地图片);
  • 另外一种是通过网络地址进行读取(网络图片)
读取本地图片

milu

    public static void main(String[] args) throws IOException {
        // 读取原图片信息 得到文件
        File srcImgFile = new File("C:\\Users\\asus\\Desktop\\img\\milu.png");
        // 将文件对象转化为图片对象
        Image srcImg = ImageIO.read(srcImgFile);
        // 获取图片的宽
        int srcImgWidth = srcImg.getWidth(null);
        // 获取图片的高
        int srcImgHeight = srcImg.getHeight(null);
        System.out.println("图片的宽:" + srcImgWidth);
        System.out.println("图片的高:" + srcImgHeight);
    }

//图片的宽:633
//图片的高:345
读取网络图片
    public static void main(String[] args) throws IOException {
        //创建一个URL对象,获取网络图片的地址信息
        URL url = new URL("https://b3logfile.com/file/2023/09/milu-GloyF04.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);
    }
//图片的宽:633
//图片的高:345

1.2添加水印

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

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

    public static void main(String[] args) throws IOException {
        // 读取原图片信息 得到文件(本地图片)
        File srcImgFile = new File("C:\\Users\\asus\\Desktop\\img\\milu.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="文字水印";
        //设置水印的坐标(为原图片中间位置)
        int x=(srcImgWidth - getWatermarkLength(waterMarkContent, g)) / 2;
        int y=srcImgHeight / 2;
        //画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标
        g.drawString(waterMarkContent, x, y);
        g.dispose();
        //-------------------------文字水印 end----------------------------
        //待存储的地址
        String tarImgPath="C:\\Users\\asus\\Desktop\\img\\2.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());
    }

2

Font 字体说明:

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

字体的风格有:

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

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

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

如何确定水印位置 ?

方法一:设置固定值

①首先,我们要知道图片上的坐标的表示法。具体如下:

image-20230920165715133

②将图片保存到本地,然后选中图片点击右键,编辑,选择“画图”软件打开

③将鼠标移动到想要添加水印的位置,左下角可以看到鼠标点击位置对应的坐标值,拿到这个坐标值写入程序即可

image-20230920165829972

方法二:根据原图大小进行设置,如放置在原图的中间位置

  • x轴坐标:(原始图的宽度 - 水印的宽度) / 2
  • y轴坐标:(原始图的高度 - 水印的高度) / 2

2.java实现给图片添加图片水印

下载水印图片到本地:

水印图片位置:C:\Users\asus\Desktop\img\水印.png

水印

    public static void main(String[] args) throws IOException {
        // 读取原图片信息 得到文件(本地图片)
        File srcImgFile = new File("C:\\Users\\asus\\Desktop\\img\\milu.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://b3logfile.com/file/2023/09/milu-GloyF04.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----------------------------
        // 水印文件
        String waterMarkImage="C:\\Users\\asus\\Desktop\\img\\水印.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="C:\\Users\\asus\\Desktop\\img\\3.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());
    }

代码执行效果

3

更多推荐

TOWE一转二家用无线遥控插座,让生活变得简单

随着科技的进步,人们的生活方式正在发生改变,越来越多的智能家居产品进入我们的生活中,为我们的生活带来了极大的便利。无线遥控插座作为一种集成了无线遥控技术与插座功能的创新产品,在家庭、办公、商业场景有着广泛的应用。同为科技(TOWE)一转二家用无线遥控插座是TOWE专为万物互联时代潮流趋势下开发的场景应用产品,为用户各类

python学习之【包和内置模块】

前言接上篇文章python学习之【模块】,这篇文章接着学习python中的包。python中的包包是一种用“点式模块名”构造Python模块命名空间的方法。在包中存放着一些功能相近的模块。包的创建和导入包的创建我们可以在pytarm中创建一个package文件,当我们创建完成后会自动创建一个__init__.py文件,

【Vue+NodeJS】vue路由及NodeJS环境搭建(Windows版)

一、Vue路由1、什么是Vue路由Vue路由是Vue.js框架中用于实现单页面应用(SPA)的路由管理器。它允许您创建多个页面之间的导航,并通过URL的变化来动态加载不同的组件。Vue路由通过声明式的方式定义页面的导航规则,并提供了一些内置的导航组件和功能,如路由链接、路由视图和导航守卫。通过Vue路由,您可以定义不同

数据预处理方式合集

删除空行#delallNonevaluedata_all.dropna(axis=1,how='all',inplace=True)删除空列#delallNonevaluedata_all.dropna(axis=0,how='all',inplace=True)缺失值处理观测缺失值观测数据缺失值有一个比较好用的工具包

蓝桥杯 题库 简单 每日十题 day6

01删除字符题目描述给定一个单词,请问在单词中删除t个字母后,能得到的字典序最小的单词是什么?输入描述输入的第一行包含一个单词,由大写英文字母组成。第二行包含一个正整数t。其中,单词长度不超过100,t小于单词长度。输出描述输出一个单词,表示答案。输入输出样例示例1输入LANQIAO3输出AIAO#include<st

【物联网】常见电子元器件(电阻、电容、电感、二极管、三极管)综合,详细分析原理及其应用

电子元器件是现代电子技术的基础,它们在各个领域中发挥着重要作用。从三极管到电容器、电阻器,这些常用元器件承担着放大、开关、滤波等关键任务。它们的特性和组合方式决定了电路的性能和功能。本文将介绍常用电子元器件的工作原理和应用场景,帮助读者更好地理解和运用它们。无论是电子爱好者还是专业工程师,对于电子元器件的了解都是必不可

走进人工智能| 智能物联网 AIoT的魅力交织

前言:AI+IoT是指人工智能(AI)与物联网(IoT)的结合。智能物联网是一种技术体系,通过连接和集成物理设备、传感器和互联网,实现设备之间的智能交互和数据共享,为人们提供智能化、自动化和高效化的生活和工作体验。文章目录序言背景领跑巨头核心技术支持目前形式发展的困难点总结序言智能物联网(InternetofThing

通信相关常识

MSISDN手机号“MSISDN”是一个移动电话号码的标识,它是国际移动用户识别码(IMSI)和移动国家代码(MCC)以及移动网络代码(MNC)的组合。MSISDN是一个唯一的电话号码,用于标识移动设备在移动通信网络中的位置和身份。它通常由国家码(国家的电话区号)和用户号码(用户的本地号码)组成。例如,一个常见的MSI

任意文件的上传和下载

1.任意文件下载(高危)定义一些网站由于业务需求,往往需要提供文件查看或文件下载功能,但若对用户查看或下载的文件不做限制,则恶意用户就能够查看或下载任意敏感文件,这就是文件查看与下载漏洞。可以下载(参数没有限制)可以通过../上一级的形式猜测下载配置文件,获取系统的账号密码挖洞的方式一般链接形式:download.ph

现今主流物联网无线通信技术分类详解

无线技术正在迅速发展,并在人们的生活中发挥越来越大的作用。而随着无线应用的增长,各种技术和设备也会越来越多,也越来越依赖于无线通信技术。本文盘点下物联网中无线通信主要的技术。一、无线通信技术的几大主流分类1.美国通信委员会(FCC)分类2015年,美国通信委员会(FCC,FederalCommunicationsCom

vue若依前端项目搭建

1.项目搭建首先进入到你需要创建的项目目录下面,然后输入命令vuecreate.创建项目接下来选择手动搭建,然后把下面图片中的内容选上再然后继续配置一些参数信息接下来运行npmrunserve项目就启动起来了2.配置登录界面文件首先修改src/router/index.js这个界面,写若依的登录界面先把这一串内容删除掉

热文推荐