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

编程入门 行业动态 更新时间:2024-10-25 07:24:20

Java实现添加文字<a href=https://www.elefans.com/category/jswz/34/1769835.html style=水印、图片水印"/>

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

 

目录

前言

一、获取原图片对象信息

1、读取本地图片

2、读取网络图片

二、处理水印

三、添加水印

四、获取目标图片

五、完整工具类

六、结果展示


前言

        现在很多人都喜欢在各种平台上分享自己的照片吧,不管是一些制作出来的媒体图片还是精致的人像图片,相信很多小伙伴都会这样。但同时也有一些让人担心的问题,怕有一些人会随意转发图片,或者盗图冒充本人。其实解决这个问题很简单,只要发布之前给图片加个水印就行了。今天分享如何用Java实现添加水印的功能。


水印可以是图片或者文字,操作方便。

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

  • 获取原图片对象信息(本地图片或网络图片)

  • 添加水印(设置水印颜色、字体、坐标等)

  • 处理输出目标图片

一、获取原图片对象信息

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

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

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

1、读取本地图片

通过代码实现读取本地目录下图片,返回的是图片对象,代码如下:

    /*** 读取本地图片** @param path 本地图片存放路径*/public static Image readLocalPicture(String path) {if (null == path) {throw new RuntimeException("本地图片路径不能为空");}// 读取原图片信息 得到文件File srcImgFile = new File(path);try {// 将文件对象转化为图片对象return ImageIO.read(srcImgFile);} catch (IOException e) {throw new RuntimeException(e);}}

2、读取网络图片

    /*** 读取网络图片** @param path 网络图片地址*/public static Image readNetworkPicture(String path) {if (null == path) {throw new RuntimeException("网络图片路径不能为空");}try {// 创建一个URL对象,获取网络图片的地址信息URL url = new URL(path);// 将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)BufferedImage bugImg = ImageIO.read(url.openStream());if (null == bugImg) {throw new RuntimeException("网络图片地址不正确");}return bugImg;} catch (IOException e) {throw new RuntimeException(e);}}

二、处理水印

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

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

    /*** 水印处理** @param image     图片对象* @param type      水印类型(1-文字水印 2-图片水印)* @param watermark 水印内容(文字水印内容/图片水印的存放路径)*/public static void manageWatermark(Image image, Integer type, String watermark) {int imgWidth = image.getWidth(null);int imgHeight = image.getHeight(null);BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);// 加水印:// 创建画笔Graphics2D graphics = bufImg.createGraphics();// 绘制原始图片graphics.drawImage(image, 0, 0, imgWidth, imgHeight, null);// 校验水印的类型if (type == 1) {if (StringUtils.isEmpty(watermark)) {throw new RuntimeException("文字水印内容不能为空");}// 添加文字水印:// 根据图片的背景设置水印颜色graphics.setColor(new Color(255, 255, 255, 128));// 设置字体  画笔字体样式为微软雅黑,加粗,文字大小为45ptgraphics.setFont(new Font("微软雅黑", Font.BOLD, 45));// 设置水印的坐标(为原图片中间位置)int x = (imgWidth - getWatermarkLength(watermark, graphics)) / 2;int y = imgHeight / 2;// 画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标graphics.drawString(watermark, x, y);graphics.dispose();} else {// 添加图片水印:if (StringUtils.isEmpty(watermark)) {throw new RuntimeException("图片水印存放路径不能为空");}Image srcWatermark = readLocalPicture(watermark);int watermarkWidth = srcWatermark.getWidth(null);int watermarkHeight = srcWatermark.getHeight(null);// 设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));// 绘制水印图片  坐标为中间位置graphics.drawImage(srcWatermark, (imgWidth - watermarkWidth) / 2,(imgHeight - watermarkHeight) / 2, watermarkWidth, watermarkHeight, null);graphics.dispose();}}

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

    /*** 获取水印文字的长度** @param watermarkContent 文字水印内容* @param graphics         图像类*/private static int getWatermarkLength(String watermarkContent, Graphics2D graphics) {return graphics.getFontMetrics(graphics.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(粗斜体)

PS

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

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

三、添加水印

直接调用上面封装好的方法。

/*** 添加水印** @param pictureType   图片来源类型(1-本地图片 2-网络图片)* @param watermarkType 水印类型(1-文字水印 2-图片水印)* @param path          图片路径* @param watermark     水印内容(文字水印内容/图片水印的存放路径)*/public static void addWatermark(Integer pictureType, Integer watermarkType, String path, String watermark) {if (null == pictureType) {throw new RuntimeException("图片来源类型不能为空");}if (null == watermarkType) {throw new RuntimeException("水印类型不能为空");}Image image;if (pictureType == 1) {// 读取本地图片image = readLocalPicture(path);} else {// 读取网络图片image = readNetworkPicture(path);}if (watermarkType == 1) {// 添加文字水印manageWatermark(image, 1, watermark);} else {// 添加图片水印manageWatermark(image, 2, watermark);}}

四、获取目标图片

经过上面的操作后,我们的图片添加文字水印或图片水印就已经处理完成了。但他现在还保存在Java对象中。

我们想要看得到效果,需要进行处理,保存图片到本地。

        // 定义存储的地址String tarImgPath = "C:/Users/admin/Desktop/watermark.jpg";// 输出图片try {FileOutputStream outImgStream = new FileOutputStream(tarImgPath);ImageIO.write(bufImg, "png", outImgStream);outImgStream.flush();outImgStream.close();} catch (IOException e) {throw new RuntimeException(e);}

五、完整工具类

以上代码,我直接整合成一个工具类。

import org.apachemons.lang3.StringUtils;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.URL;/*** 添加水印util*/
public class WatermarkUtil {/*** 读取本地图片** @param path 本地图片存放路径*/public static Image readLocalPicture(String path) {if (null == path) {throw new RuntimeException("本地图片路径不能为空");}// 读取原图片信息 得到文件File srcImgFile = new File(path);try {// 将文件对象转化为图片对象return ImageIO.read(srcImgFile);} catch (IOException e) {throw new RuntimeException(e);}}/*** 读取网络图片** @param path 网络图片地址*/public static Image readNetworkPicture(String path) {if (null == path) {throw new RuntimeException("网络图片路径不能为空");}try {// 创建一个URL对象,获取网络图片的地址信息URL url = new URL(path);// 将URL对象输入流转化为图片对象 (url.openStream()方法,获得一个输入流)BufferedImage bugImg = ImageIO.read(url.openStream());if (null == bugImg) {throw new RuntimeException("网络图片地址不正确");}return bugImg;} catch (IOException e) {throw new RuntimeException(e);}}/*** 水印处理** @param image     图片对象* @param type      水印类型(1-文字水印 2-图片水印)* @param watermark 水印内容(文字水印内容/图片水印的存放路径)*/public static String manageWatermark(Image image, Integer type, String watermark) {int imgWidth = image.getWidth(null);int imgHeight = image.getHeight(null);BufferedImage bufImg = new BufferedImage(imgWidth, imgHeight, BufferedImage.TYPE_INT_RGB);// 加水印:// 创建画笔Graphics2D graphics = bufImg.createGraphics();// 绘制原始图片graphics.drawImage(image, 0, 0, imgWidth, imgHeight, null);// 校验水印的类型if (type == 1) {if (StringUtils.isEmpty(watermark)) {throw new RuntimeException("文字水印内容不能为空");}// 添加文字水印:// 根据图片的背景设置水印颜色graphics.setColor(new Color(255, 255, 255, 128));// 设置字体  画笔字体样式为微软雅黑,加粗,文字大小为45ptgraphics.setFont(new Font("微软雅黑", Font.BOLD, 45));// 设置水印的坐标(为原图片中间位置)int x = (imgWidth - getWatermarkLength(watermark, graphics)) / 2;int y = imgHeight / 2;// 画出水印 第一个参数是水印内容,第二个参数是x轴坐标,第三个参数是y轴坐标graphics.drawString(watermark, x, y);graphics.dispose();} else {// 添加图片水印:if (StringUtils.isEmpty(watermark)) {throw new RuntimeException("图片水印存放路径不能为空");}Image srcWatermark = readLocalPicture(watermark);int watermarkWidth = srcWatermark.getWidth(null);int watermarkHeight = srcWatermark.getHeight(null);// 设置 alpha 透明度:alpha 必须是范围 [0.0, 1.0] 之内(包含边界值)的一个浮点数字graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.9f));// 绘制水印图片  坐标为中间位置graphics.drawImage(srcWatermark, (imgWidth - watermarkWidth) / 2,(imgHeight - watermarkHeight) / 2, watermarkWidth, watermarkHeight, null);graphics.dispose();}// 定义存储的地址String tarImgPath = "C:/Users/admin/Desktop/watermark.jpg";// 输出图片try {FileOutputStream outImgStream = new FileOutputStream(tarImgPath);ImageIO.write(bufImg, "png", outImgStream);outImgStream.flush();outImgStream.close();return "水印添加成功";} catch (IOException e) {throw new RuntimeException(e);}}/*** 添加水印** @param pictureType   图片来源类型(1-本地图片 2-网络图片)* @param watermarkType 水印类型(1-文字水印 2-图片水印)* @param path          图片路径* @param watermark     水印内容(文字水印内容/图片水印的存放路径)*/public static String addWatermark(Integer pictureType, Integer watermarkType, String path, String watermark) {if (null == pictureType) {throw new RuntimeException("图片来源类型不能为空");}if (null == watermarkType) {throw new RuntimeException("水印类型不能为空");}Image image;if (pictureType == 1) {// 读取本地图片image = readLocalPicture(path);} else {// 读取网络图片image = readNetworkPicture(path);}if (watermarkType == 1) {// 添加文字水印return = manageWatermark(image, 1, watermark);} else {// 添加图片水印return = manageWatermark(image, 2, watermark);}}/*** 获取水印文字的长度** @param watermarkContent 文字水印内容* @param graphics         图像类*/private static int getWatermarkLength(String watermarkContent, Graphics2D graphics) {return graphics.getFontMetrics(graphics.getFont()).charsWidth(watermarkContent.toCharArray(), 0, watermarkContent.length());}public static void main(String[] args) {// 本地图片路径:String localPath = "C:/Users/admin/Desktop/bg.jpg";// 网络图片地址:String networkPath = "=3708545959,316194769&fm=253&fmt=auto&app=138&f=PNG?w=1000&h=1000";// 文字水印内容String textWatermark = "Hello World!";// 图片水印路径String pictureWatermark = "C:\\Users\\admin\\Desktop\\wm.jpg";// 本地图片 添加文字水印//addWatermark(1, 1, localPath,textWatermark);// 网络图片 添加文字水印//addWatermark(2, 1, networkPath, textWatermark);// 本地图片 添加图片水印//addWatermark(1, 2, localPath, pictureWatermark);// 网络图片 添加图片水印addWatermark(2, 2, networkPath, pictureWatermark);}}

六、结果展示

1、本地图片+文字水印:

2、本地图片+图片水印:

3、网络图片+文字水印:

4、网络图片+图片水印:

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。 

更多推荐

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

本文发布于:2023-12-03 23:43:29,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1659079.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:水印   文字   图片   Java

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!