Redian新闻
>
Java实现添加文字水印、图片水印功能实战

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

公众号新闻

大家好,我是编程君!

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

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

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


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


1、获取原图片对象信息

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

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

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


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 读取网络图片

//创建一个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);

代码效果如下:


2、添加水印

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

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

BufferedImage bufImg = new BufferedImage(srcImgWidth, srcImgHeight, BufferedImage.TYPE_INT_RGB);
// 加水印
//创建画笔
Graphics2D g = bufImg.createGraphics();
//srcImg 为上面获取到的原始图片的图片对象
g.drawImage(srcImg, 00, 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();

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());
}

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();

执行效果:

执行,目标目录下多了一个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, 00, 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());
    }
}


二、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();


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, 00, 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());
    }
}


3、代码执行效果

t.png图片文件中 含有 水印图片,说明 图片水印添加成功!

原文:
blog.csdn.net/qq_26383975/article/details/125996277


PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。

 关注公众号:Java后端编程,回复下面关键字 


要Java学习完整路线,回复  路线 

缺Java入门视频,回复 视频 

要Java面试经验,回复  面试 

缺Java项目,回复: 项目 

进Java粉丝群: 加群 


PS:如果觉得我的分享不错,欢迎大家随手点赞、在看。

(完)




加我"微信获取一份 最新Java面试题资料

请备注:666不然不通过~


最近好文


1、一个由 “ YYYY-MM-dd ” 引发的惨案 !

2、MySQL中update“经典”的坑,这样写语句,直接劝退!

3、SpringBoot:一个注解就能帮你下载任意对象

4、Controller 层代码就该这么写,简洁又优雅!

5、一台服务器最大能支持多少条 TCP 连接



最近面试BAT,整理一份面试资料Java面试BAT通关手册,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:关注公众号并回复 java 领取,更多内容陆续奉上。
明天见(。・ω・。)ノ

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
第十章 美国社会的方方面面 (1)美中嘉和再次冲刺港股:上半年亏2亿 迟迟未能实现IPO到了现在,你还在怀疑AI画图不能实战?One Last Walk 最后一程 【小说】重磅!Top1文理学院正式取消附加文书无经验拿offer,能实现吗?看看他们是如何做到的!即将截止|《数据/商业分析求职实战营》明日开课,工业级实战项目,赶快报名!初秋的早上吴某凡据说在监狱表现不错!激情创作正能量歌曲,还参加文艺汇演!戴维营峰会召开,美利坚打造“亚洲小北约”的企图能实现吗?印、巴宗教冲突不止 教堂遭焚 教会社区受暴力胁迫2023年8月23日未来科学大奖直播视频之二:室温超导有可能实现吗?专家:不存在理论上的障碍最后机会|《数据/商业分析求职实战营》马上开课,三大跨行业名企实战项目,拓展视野,提升端到端项目完成能力!被启明、金域投了近亿元的百趣生物,凭什么其质谱服务能实现年检测20万例样本?学会这个技能,30岁后仍能实现人生跃迁伯恩斯大使:欢迎加州州长加文·纽森来到中国免费试听|数据/商业分析求职实战营即将开课,工业级实战项目,掌握核心必备技能!问界新M7推营销新玩法:可享华为Mate 60或X5优先购买权;白宫:英伟达等八家公司承诺为AI生成内容添加数字水印丨大公司动态惠普打印机现货!彩印、复印、扫描于一身的家用无线打印机,孩子开学天天用,0难度操作千万人围观「烧焦婴儿」图片!伯克利教授辟谣:AI图片检测器无用Redis实战 | 使用Redis 的有序集合(Sorted Set)实现排行榜功能,和Spring Boot集成险些命丧美容床!亚裔美女在按摩店做“艾疗” 导致三度烧伤 大片水泡中产变富人!上私校真的能实现破圈跃阶吗?“为万虫写照”齐白石数字水墨,限量发行!赵丽颖突然官宣喜讯!全网炸了:10年了图片图片图片我们公开吧……2024年度卫生专业技术资格考试考生须知【报名、确认、缴费、准考证打印、考试、成绩发布】探索|深入亚马逊雨林,沉醉“天空之城” ,探访印加文明!秘鲁,一个你来了就不想走的地方调查了800种零添加商品,却发现加了81种添加剂:“0添加”“不干净”“他们说这在中国很正常” 澳女拔火罐后出现大片水泡,华人店家否认操作不当SpringBoot AOP + Redis 延时双删功能实战很多神圣事物早期都有普通实用的功能,只不过后来与部落、徽章、图腾等结合固定了下来|刘妍「中洲奇观」4全澳首个!悉尼机场推出“黑科技”,AR地图功能在室内也能实时导航停电人生困境与白左自辩风口上的冲锋衣究竟能不能实现可持续?
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。