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

目录

  • 一、java实现给图片添加文字水印
    • 1.获取原图片对象信息
      • 1.1 读取本地图片
      • 1.2 读取网络图片
    • 2.添加水印
    • 3.获取目标图片
    • 4.完成代码
  • 二、java实现给图片添加图片水印
    • 1.添加图片水印方法:
    • 2.完成代码
    • 3.代码执行效果

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

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

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, 0, 0, srcImgWidth, srcImgHeight, null);//-------------------------文字水印 start----------------------------//根据图片的背景设置水印颜色g.setColor(new Color(255,255,255,128));//设置字体  画笔字体样式为微软雅黑,加粗,文字大小为60ptg.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, 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());}
}

3.代码执行效果


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

java实现给图片添加水印(文字水印或图片水印)相关推荐

  1. JS前端基于canvas给图片添加水印,并下载带有水印的图片

    基于canvas给图片添加水印 实现效果图 图片添加水印的步骤 1.获取图片路径,将图片转换为canvas 2.canvas画布上绘制文字水印 3.水印绘制完成后,将canvas转换为图片格式 4.水 ...

  2. 给图片添加文字(换行)水印

    Android给图片添加半透明背景的水印 (水印带有半透明底色) 给图片添加文字(换行)水印 1.绘制富文本: /** * 绘制富文本* StaticLayout可实现换行* <p>* h ...

  3. Python往图片写入文字,插入图片的方法

    Python往图片写入文字,插入图片的方法 使用情景 效果 代码 使用情景 做短视频编辑的时候,经常需要向图片中写入一些文字,插入图片,以增加图片的美观.本文将介绍使用python的Pillow库,将 ...

  4. Java实现图片添加水印文字

    项目中遇到要在图片上添加水印文字,类似于像生日贺卡那种推送,就是有一张底图,然后我们需要动态替换掉上面名字,性别,部门啥的给公司人员推送一个生日祝福,一开始使用富文本和一些html转图片的工具来做,发 ...

  5. java图片添加水印文字

    jAVA图片中添加文字水印(铺满整个图片) package com.zhuozhengsoft.mark; import java.awt.AlphaComposite; import java.aw ...

  6. html图片加文字批量处理,图片批量加水印工具,图片批量添加文字|图片同时添加文字或图片水印...

    一般在网上下载的图片都会自动带有相应网站的文字或是图片水印,虽然可能在使用图片素材的时候,图片上的水印会在一定程度上影响美观,但是水印是对于版权或者是原创的一个保护,图片水印不仅是可以保护别人的原创图 ...

  7. 图片添加水印文字方法 图片批量添加水印教程

    为了防止图片被别人盗用,我们经常给图片添加自己的水印,使用Ps添加水印,但是需要要一张一张的添加,非常麻烦,所以给你大家介绍一个快速批量添加水印的方法. 使用工具:图片水印添加大师 第一步打开&quo ...

  8. File之图片添加水印文字

    主程序 public void IoReadImage(HttpServletRequest request, HttpServletResponse response) throws IOExcep ...

  9. 给图片加文字,加图片

    '''给图片加文字''' from PIL import Image, ImageDraw, ImageFontfile = 'C:\\Users\\14399\\Desktop\\new_1.png ...

  10. div css将文字居中显示图片,css文字居中、图片居中、div居中解决方案

    一.文字居中 若文字只有一行 文本只有一行 .box { width: 200px; height: 200px; background-color: red; } .text { line-heig ...

最新文章

  1. linux中probe函数传递参数的寻找(下)
  2. cmd命令快速启动、暂停和关闭sql server服务
  3. 【AI初识境】如何增加深度学习模型的泛化能力
  4. 经典案例鸢尾花分类, 在Keras中使用sklearn调参
  5. IDA Plugin 编写基础
  6. 献礼724运维日 | 首届腾讯运维技术开放日讲了啥? (附演讲PPT领取方式)
  7. Gradle善良:仅添加包装用于战争
  8. python 爬虫1:发送请求
  9. C语言存储地址规律,一数组按顺序序存放,插入一个数,按原来排序规律放在相应位置...
  10. [Matlab科学绘图] Matlab画图常用函数和命令
  11. wps html嵌入ppt,wps文档怎么插入打开幻灯片 WPS文字添加ppt幻灯片教程
  12. 《计算机工程》期刊投稿经验分享
  13. JavaWeb 图书推荐
  14. Python 声明变量
  15. 6G定位的潜力与挑战
  16. java基础巩固-宇宙第一AiYWM:为了维持生计,多高(多线程与高并发)_Part1~整起(线程与进程篇:线程概念、线程状态、线程死锁)
  17. xp无法ping工作组计算机,在XP下Ping不通win2003怎么解决?
  18. nginx错误:unknown directive “锘? in F:\nginx/conf/nginx.conf:3
  19. C7-如何学好C语言
  20. 关于NS2多接口多信道扩展方案

热门文章

  1. 微信小程序在线考试系统 刷题考试小程序毕业设计 毕业论文 开题报告和效果图参考
  2. Microsoft HoloLens 技术解谜(下)
  3. 极品PS动作繁星散射GIF动画
  4. 操作系统的目标和作用
  5. Angular 入门教程系列:33:移动端统计图表F2
  6. 计算机无法识别建行网银盾,建行网银盾无法识别怎么办 几招办法教你轻松解决...
  7. C#时间格式转换时间戳
  8. VB.NET读写文本文件方法
  9. Trie树(字典树)
  10. 计算机主机一闪一闪的无法启动,电脑无法正常启动,启动时绿灯一闪一闪的