使用Java给图片添加水印
什么是水印呢?比如使用手机拍摄一张照片的时候,照片右下角的位置显示得有日期和时间信息,那就表示一个水印。

项目开发中给图片添加水印的操作很常见,比如给图片添加日期和时间,给图片添加公司的logo之类的等等。下面就来聊聊如何使用Java来给图片添加水印。
大致的思路如下:
实现方式:读取原图片信息转为 BufferedImage对象;然后利用 BufferedImage 创建 Graphics2D画笔对象,再使用绘图对象中的API进行相应的操作。
实现步骤:
(1)读取原图片数据。
(2)根据原图片数据生成一张新的空白图片
(3)获取新图片的画笔对象
(4)将原图片画在新图片中
(5)使用画笔设置水印内容相关信息如颜色、字体位置等。
(6)保存新生成的图片数据。
涉及到的主要类有.
.1.BufferedImage 图片缓冲类
.2.Graphics2D 画笔类
常用方法
drawImage() 表示绘制图片
setColor() 设置颜色
setFont() 设置字体
drawString(String str, int x, int y) 表示设置绘画内容
参数一: 绘制的"内容";
参数二: 内容在图片中的x坐标,
参数三: 内容在图片中的y坐标
dispose() 表示释放资源
.4.ImageIO Java操作图片文件的类
常用方法
ImageIO.read(File对象)
表示读取图片文件数据
ImageIO.write(RenderedImage im, String formatName, OutputStream output);
向输出流中写入图片数据,有三个参数
参数一: 表示缓冲图片对象
参数二: 表示设置格式化名称
参考示例代码如下:
/**
* 添加水印
* @param sourceImg 原图片对象
* @param textColor 文本颜色
* @param fontSize 字体大小
* @param text 文本内容
* @param outPath 图片输出路径
*/
public static void addTextWaterMark(BufferedImage sourceImg, Color textColor, int fontSize, String text, String outPath) {
// 获取原图片的宽
int width = sourceImg.getWidth();
// 获取原图片的高
int height = sourceImg.getHeight();
// 创建一个与原图片大小相同的图片
BufferedImage bufferedImage = new BufferedImage(width,height,BufferedImage.TYPE_INT_BGR);
// 获取图片的画笔对象
Graphics2D gph = bufferedImage.createGraphics();
// 将原图片绘制到空白图片上
gph.drawImage(sourceImg, 0, 0, width, height, null);
// 设置水印颜色
gph.setColor(textColor);
// 设置水印字体
gph.setFont(new Font("微软雅黑", Font.ITALIC, fontSize));
// 设置水印内容放置位置
// int x = width - (text.length() + 1) * fontSize;
// int y = height- fontSize * 2;
int x = width - 6 * fontSize;
int y = height - fontSize / 2;
// 设置水印内容
gph.drawString(text, x, y);
try(BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outPath));) {
// 保存新生成的图片
ImageIO.write(bufferedImage, "jpg", bos);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
// 释放资源
gph.dispose();
}
}
说明:操作IO流的时候,能使用带缓冲区的类尽量使用,在一定程度上可以提升文件操作的效率。
然后写一段简单的测试代码如下:
// 读取图片文件信息
File file = new File("C:\\Users\\xxx\\Desktop\\temp.png");
// 将图片文件转换为 BufferedImage 对象
BufferedImage image = ImageIO.read(file);
addTextWaterMark(image, Color.RED, 80, "2024-03-14", "C:\\Users\\xxx\\Desktop\\temp.jpg");
System.out.println("图片处理完成");
在一张图片中的右下角添加一个日期,测试结果如下:

字体的大小,颜色,样式等内容都可以自己根据需要进行调整。
使用Java给图片添加水印的更多相关文章
- JAVA给图片添加水印
package com.test; import org.junit.Test; import javax.imageio.ImageIO; import java.awt.*; import jav ...
- Java实现图片添加水印
参考别人的感觉挺好玩,还没仔细研究,先上代码. package WaterMark; import javax.imageio.ImageIO; import java.awt.*; import j ...
- java实现给图片添加水印
package michael.io.image; import java.awt.AlphaComposite; import java.awt.Graphics2D; import java.aw ...
- java.imageIo给图片添加水印
最近项目在做一个商城项目, 项目上的图片要添加水印①,添加图片水印;②:添加文字水印; 一下提供下个方法,希望大家可以用得着: package com.blogs.image; import java ...
- Java给图片和PDF文件添加水印(图片水印和文字水印)
有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...
- Java 图片添加水印效果
package com.xiaowu.drawwater.demo; import java.awt.AlphaComposite; import java.awt.Graphics2D; impor ...
- java实现图片和pdf添加铺满文字水印
依赖jar包 <!-- pdf start --> <dependency> <groupId>com.itextpdf</groupId> <a ...
- Java中图片压缩处理
原文http://cuisuqiang.iteye.com/blog/2045855 整理文档,搜刮出一个Java做图片压缩的代码,稍微整理精简一下做下分享. 首先,要压缩的图片格式不能说动态图片,你 ...
- java获取图片原始尺寸
java获取图片原始尺寸 URL url = null; InputStream is = null; BufferedImage img = null; try { url = new URL(pi ...
- Android 图片添加水印图片或者文字
给图片添加水印的基本思路都是载入原图,添加文字或者载入水印图片,保存图片这三个部分 添加水印图片: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 ...
随机推荐
- 4.if语句--《Python编程:从入门到实践》
4.1 检查多个条件 1.使用 and 检查多个条件 2.使用 or 检查多个条件 4.2 检查特定值是否包含在列表中 使用 in 检查特定值是否在列表中 >>> req ...
- go中的 位预算,反码、补码、原码
https://baike.baidu.com/item/%E4%BD%8D%E8%BF%90%E7%AE%97/6888804 首先关于"位运算",看下百度百科就行了. 总结:在 ...
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第9章)-- 读书笔记(上)
第 9 章 测试和文档 9.1 测试 测试是软件生命周期中的一个非常重要的阶段,对于保证软件的可靠性具有极其重要的意义 常见的测试方法有很多,根据不同的维度,可以把测试方法分为不同的类别 从观察结构的 ...
- ASP.NET Core分布式项目实战(集成ASP.NETCore Identity)--学习笔记
任务24:集成ASP.NETCore Identity 之前在 Index 页面写了一个 strong 标签,需要加个判断再显示,不然为空没有错误的时候也会显示 @if (!ViewContext.M ...
- SATA学习笔记——Transport Layer 概述
一.故事前传 在之前的文章中,我们有提到SATA主要包括:应用层(Application Layer), 传输层(Transport Layer),链路层(Link Layer)以及物理层(Physi ...
- Reactive 简介
1. 概念 Reactive 非常适合低延迟.高吞吐量的工作负载. Reactive Processing 是一种范式(规范),它使开发人员能够构建非阻塞的.异步的应用程序,这些应用程序能够处理背压( ...
- dd命令创建文件
dd if=... of=... bs=... count=... if表示输入文件,of表示输出文件,bs默认指定了以字节为单位的块大小(单位有字节c,字w,块B,千字节m,兆字节m,吉字节G),c ...
- Linux开端---Centos
Linux-Centos 虚拟化所需工具:https://pan.baidu.com/s/1643-kYcx9oPGnGEZM1pLOw?pwd=g0v5 提取码:g0v5 问题解决 正常注册网络适配 ...
- 在本地运行 LLMs 的 6 种方法
商业人工智能和大型语言模型 (LLM) 有一个很大的缺点:隐私.在处理敏感数据或专有数据时,我们无法从这些工具中获益.因此,我们需要了解如何在本地运行私人 LLM.开源模型提供了一种解决方案,但它们也 ...
- Centos8上安装Redis5.X
一.下载Redis 下载地址:wget http://download.redis.io/releases/redis-5.0.7.tar.gz 解压:tar -xzvf redis-5.0.7.ta ...