java.awt和
javax.imageio库实现图片文字水印:读取原始图片,通过
Graphics2D对象设置字体、颜色和透明度,在指定位置绘制水印文字,最后保存处理后的图片文件。
在Java中给图片添加水印文字是一个常见的需求,常用于保护版权、添加品牌标识或标记图片来源,这可以通过Java的标准库如Java AWT(Abstract Window Toolkit)和Java 2D API实现,无需额外依赖,下面我将详细解释整个过程,包括步骤、代码示例和注意事项,整个过程基于Java的核心API,确保高效且可靠。
为什么需要给图片加水印文字?
水印文字可以防止图片被滥用,例如在网站或社交媒体上分享时,保留原创者信息,Java提供了简单的方式来实现这一功能,通过操作图片的像素和图形上下文,添加自定义文字。
准备工作
在开始前,确保您具备:
- Java开发环境(JDK 8或更高版本)。
- 一张原始图片(支持常见格式如JPEG、PNG)。
- 一个Java IDE(如Eclipse或IntelliJ IDEA)或命令行工具。
详细步骤:使用Java给图片添加水印文字
以下是完整的步骤指南,我将使用Java的BufferedImage和Graphics2D类来实现,整个过程分为加载图片、绘制水印和保存图片三个阶段。

步骤1: 导入必要的Java包
在Java代码中导入所需的类,这些包属于Java标准库,无需额外安装。
import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import javax.imageio.ImageIO;
步骤2: 加载原始图片
使用ImageIO.read()方法读取图片文件,确保文件路径正确,并处理可能的异常(如文件不存在或格式不支持)。
// 定义原始图片路径和水印保存路径
String inputImagePath = "path/to/your/input.jpg"; // 替换为您的图片路径
String outputImagePath = "path/to/your/output.jpg"; // 输出图片路径
try {
// 加载原始图片
BufferedImage originalImage = ImageIO.read(new File(inputImagePath));
if (originalImage == null) {
throw new IOException("无法加载图片,请检查路径或格式");
}
// 创建副本以绘制水印
BufferedImage watermarkedImage = new BufferedImage(
originalImage.getWidth(),
originalImage.getHeight(),
BufferedImage.TYPE_INT_RGB
);
Graphics2D g2d = watermarkedImage.createGraphics();
g2d.drawImage(originalImage, 0, 0, null); // 将原始图片绘制到副本上
步骤3: 设置水印文字属性
定义水印文字的字体、颜色、位置和透明度,使用Graphics2D对象来配置这些属性。

// 设置水印文字
String watermarkText = "© Your Brand"; // 自定义水印文字
g2d.setFont(new Font("Arial", Font.BOLD, 36)); // 字体、样式和大小
g2d.setColor(new Color(255, 255, 255, 128)); // 颜色(RGB)和透明度(128表示半透明)
// 计算水印位置(居中示例)
int x = (watermarkedImage.getWidth() - g2d.getFontMetrics().stringWidth(watermarkText)) / 2;
int y = watermarkedImage.getHeight() / 2;
步骤4: 绘制水印文字
使用drawString()方法将文字添加到图片上,可以调整位置以实现不同效果(如角落水印)。
// 绘制水印文字
g2d.drawString(watermarkText, x, y);
// 释放资源
g2d.dispose();
步骤5: 保存带水印的图片
将修改后的图片保存到文件系统,指定输出格式(如JPEG或PNG)。
// 保存图片
ImageIO.write(watermarkedImage, "jpg", new File(outputImagePath)); // 格式可改为"png"等
System.out.println("水印添加成功!保存至: " + outputImagePath);
} catch (IOException e) {
e.printStackTrace(); // 处理异常
}
完整代码示例
以下是一个可运行的Java类,整合了所有步骤,复制到IDE中运行即可。

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
public class ImageWatermarker {
public static void main(String[] args) {
String inputImagePath = "input.jpg"; // 输入图片路径
String outputImagePath = "output.jpg"; // 输出图片路径
String watermarkText = "© Sample Watermark"; // 水印文字
try {
// 加载原始图片
BufferedImage originalImage = ImageIO.read(new File(inputImagePath));
if (originalImage == null) {
System.err.println("错误:图片加载失败");
return;
}
// 创建副本并绘制原始图片
BufferedImage watermarkedImage = new BufferedImage(
originalImage.getWidth(),
originalImage.getHeight(),
BufferedImage.TYPE_INT_RGB
);
Graphics2D g2d = watermarkedImage.createGraphics();
g2d.drawImage(originalImage, 0, 0, null);
// 设置水印属性
g2d.setFont(new Font("Arial", Font.BOLD, 36));
g2d.setColor(new Color(255, 255, 255, 128)); // 白色半透明
// 计算位置(居中)
int x = (watermarkedImage.getWidth() - g2d.getFontMetrics().stringWidth(watermarkText)) / 2;
int y = watermarkedImage.getHeight() / 2;
// 添加水印文字
g2d.drawString(watermarkText, x, y);
g2d.dispose(); // 释放资源
// 保存图片
ImageIO.write(watermarkedImage, "jpg", new File(outputImagePath));
System.out.println("成功添加水印!文件已保存至: " + outputImagePath);
} catch (IOException e) {
e.printStackTrace();
}
}
}
常见问题与优化提示
- 图片格式支持:Java的
ImageIO支持JPEG、PNG等格式,如果遇到问题,检查文件后缀是否正确。 - 水印位置调整:要添加角落水印,修改坐标计算(如
x = 10; y = watermarkedImage.getHeight() - 10;)。 - 透明度控制:通过
Color的alpha值(0-255)调整透明度,值越低越透明。 - 性能优化:处理大图片时,使用
BufferedImage的适当类型(如TYPE_INT_ARGB支持透明度),避免内存溢出。 - 错误处理:添加try-catch块捕获
IOException,确保代码健壮。 - 字体兼容性:如果系统缺少指定字体,使用
Font.createFont()加载自定义字体文件。 - 多水印支持:循环绘制多个文字或旋转水印(使用
g2d.rotate(angle))。
通过Java的AWT和2D API,您可以轻松给图片添加水印文字,无需第三方库,整个过程涉及加载图片、绘制文字和保存结果,代码简洁高效,在实际应用中,测试不同水印样式以确保清晰度和美观性,如果您是开发者,这段代码可以直接集成到Web应用或批处理工具中。
引用说明:本文内容基于Java官方文档(Oracle Java SE Documentation)和常见编程实践,确保准确性和可靠性,具体API参考:Java AWT和Java 2D官方教程。
