Java实现在图片中添加文字水印的示例代码
本文介绍了一个使用Java实现的图片水印工具,该工具能够读取指定路径的图片,在图片上添加文字水印,并将带有水印的图片保存到指定路径。文章详细展示了如何使用Java AWT库进行图片处理,包括设置水印的颜色、字体、位置等。
完整代码如下:
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* @Author: 浮云
* @Date: 2019/12/21 21:51
*/
public class MarkImageUtils {
public static void main(String[] args) {
Color color=new Color(255, 45, 160);
Font font = new Font("微软雅黑", Font.BOLD, 30);
waterMark("D:/Temp/test.jpg", "D:/Temp//test1.png","好冷~呜呜呜~~~",color,font,130,50);
}
/**
* @param filePath 原图片
* @param outFile 输出图片
* @param text 水印文字
* @param color 颜色
* @param font 字体
* @param x 水印起始X坐标
* @param y 水印起始Y坐标
* @return 添加水印是否成功 true-成功 false-失败
*/
public static boolean waterMark(String filePath, String outFile,
String text, Color color, Font font, int x, int y) {
String result = "打水印失败!";
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
BufferedImage im = ImageIO.read(fis);//读取原图片
int width = im.getWidth();//原图片宽
int height = im.getHeight();//原图片高
//判断水印起始x和y坐标是否小于原图片宽和高
if (x > width || y > height) {
System.out.println(result);
return false;
}
Graphics g = im.getGraphics();//创建画板
g.setColor(color);//设置颜色
g.setFont(font);//设置文字样式
g.drawString(text, x, y);//向画板上写字
g.dispose();//释放资源
ImageIO.write(im, "jpg", new File(outFile));
} catch (IOException e) {
System.out.println(result);
return false;
} finally {
closeFileInputStream(fis);
}
result = "打水印成功!";
System.out.println(result);
return true;
}
/**
* 关闭文件输入流
* @param fis
*/
public static void closeFileInputStream (FileInputStream fis){
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如果不知道有哪些字体,可以用以下代码打印所有字体
import java.awt.*;
/**
* @Author: 浮云
* @Date: 2019/12/22 0:23
*/
public class FontDemo {
public static void main(String[] args) {
Font[] fonts = GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getAllFonts();
for (Font font : fonts) {
System.out.println(font.getFontName());
}
}
}
知识补充:
在 Java 中为图片添加文字水印是非常常见的需求,通常使用 java.awt 包下的 Graphics2D 类就能轻松实现。下面我会提供一个简洁但功能完整的方法,支持设置水印文本、字体、颜色、透明度、位置以及旋转角度。
基础实现:添加单个文字水印
以下代码可以在图片的指定位置添加一个半透明文字水印。
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageWatermark {
/**
* 为图片添加文字水印
*
* @param srcImageFile 源图片文件路径
* @param destImageFile 目标图片文件路径
* @param watermarkText 水印文字
* @param x 水印左上角 X 坐标(相对原图)
* @param y 水印左上角 Y 坐标
* @param fontSize 字体大小(像素)
* @param alpha 透明度 (0.0 ~ 1.0)
* @param angle 旋转弧度(0 表示不旋转)
*/
public static void addTextWatermark(String srcImageFile, String destImageFile,
String watermarkText, int x, int y,
int fontSize, float alpha, double angle) throws IOException {
// 1. 读取原图
BufferedImage image = ImageIO.read(new File(srcImageFile));
int width = image.getWidth();
int height = image.getHeight();
// 2. 创建 Graphics2D 对象
Graphics2D g2d = image.createGraphics();
// 开启抗锯齿,让文字边缘更平滑
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// 3. 设置字体和颜色
Font font = new Font("宋体", Font.BOLD, fontSize);
g2d.setFont(font);
g2d.setColor(Color.WHITE); // 文字颜色
// 4. 设置透明度(AlphaComposite)
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2d.setComposite(alphaComposite);
// 5. 旋转文字(如果需要)
if (angle != 0) {
g2d.rotate(angle, x + (fontSize * watermarkText.length()) / 4.0, y + fontSize / 2.0);
}
// 6. 绘制水印文字
g2d.drawString(watermarkText, x, y);
// 7. 释放资源
g2d.dispose();
// 8. 保存新图片
String format = destImageFile.substring(destImageFile.lastIndexOf(".") + 1);
ImageIO.write(image, format, new File(destImageFile));
}
public static void main(String[] args) {
try {
addTextWatermark("input.jpg", "output.jpg",
"© 2026 MyCompany", 50, 100,
36, 0.5f, 0);
System.out.println("水印添加成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
}高级用法:自动定位(右下角、居中、平铺)
1. 水印位于右下角,自动偏移
int margin = 20; FontMetrics metrics = g2d.getFontMetrics(font); int textWidth = metrics.stringWidth(watermarkText); int textHeight = metrics.getHeight(); int x = width - textWidth - margin; int y = height - margin;
2. 水印平铺整个图片(防截图)
可以利用循环绘制多个水印,常见于版权保护。
int stepX = 200;
int stepY = 150;
for (int i = 0; i < width; i += stepX) {
for (int j = 0; j < height; j += stepY) {
g2d.drawString(watermarkText, i, j);
}
}3. 水印居中并旋转一定角度
// 获取文字宽高 FontMetrics fm = g2d.getFontMetrics(); int textWidth = fm.stringWidth(watermarkText); int textHeight = fm.getHeight(); // 中心点坐标 int centerX = width / 2 - textWidth / 2; int centerY = height / 2 + textHeight / 4; // 视觉居中 // 旋转 30 度(弧度制) double angle = Math.toRadians(30); g2d.rotate(angle, width / 2.0, height / 2.0); g2d.drawString(watermarkText, centerX, centerY);
常见问题与注意事项
| 问题 | 解决方案 |
|---|---|
| 中文乱码 | 确保使用的字体支持中文(如 "宋体"、"Microsoft YaHei"、"SimHei"),不要用 "Arial"。 |
| 文字锯齿 | 开启抗锯齿提示:g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); |
| 透明背景图片(PNG) | 水印会正常叠加,无需特殊处理;如果希望水印也带半透明,调整 alpha 值即可。 |
| 保存格式限制 | 某些格式(如 GIF)不支持高精度颜色,建议保存为 PNG 或 JPG。 |
| 性能优化 | 若对大量图片添加相同水印,可提前预计算字体和透明度,避免在循环中重复创建 Font 对象。 |
扩展:水印工具类封装(支持更多参数)
public class WatermarkUtil {
/**
* 添加文字水印
* @param src 源图片路径
* @param dest 目标路径
* @param text 水印文字
* @param config 配置项(位置、字体、颜色、透明度等)
*/
public static void watermark(String src, String dest, String text, WatermarkConfig config) throws IOException {
// ... 具体实现
}
public static class WatermarkConfig {
private int x = -1; // 负值表示自动计算
private int y = -1;
private String fontName = "宋体";
private int fontSize = 36;
private Color color = Color.WHITE;
private float alpha = 0.6f;
private double angle = 0;
private boolean tile = false; // 是否平铺
private int tileStepX = 200;
private int tileStepY = 150;
// ... getter / setter
}
}总结
- 核心步骤:
ImageIO.read→Graphics2D→ 设置透明度和字体 →drawString→ImageIO.write - 关键技巧:使用
AlphaComposite实现半透明效果;利用FontMetrics精确计算文字尺寸;开启抗锯齿提升显示质量。 - 适用场景:图片版权保护、分享标记、上传预览图标识等。
到此这篇关于Java实现在图片中添加文字水印的示例代码的文章就介绍到这了,更多相关Java图片添加文字水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
SpringBoot中Zookeeper分布式锁的原理和用法详解
Zookeeper是一个分布式协调服务,它提供了高可用、高性能、可扩展的分布式锁机制,SpringBoot是一个基于Spring框架的开发框架,它提供了对Zookeeper分布式锁的集成支持,本文将介绍SpringBoot中的 Zookeeper分布式锁的原理和使用方法,需要的朋友可以参考下2023-07-07
Spring、SpringMVC和SpringBoot的区别及说明
这篇文章主要介绍了Spring、SpringMVC和SpringBoot的区别及说明,具有很好的参考价值,希望对大家有所帮助。2022-10-10


最新评论