本文目录导读:

我来为您介绍Java中添加图片水印的完整案例,包括文字水印和图片水印两种方式。
基本环境配置
首先需要添加依赖(Maven项目):
<dependency>
<groupId>javax.media</groupId>
<artifactId>jai_core</artifactId>
<version>1.1.3</version>
</dependency>
文字水印添加
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class TextWatermark {
/**
* 添加文字水印
* @param sourcePath 原图路径
* @param targetPath 目标路径
* @param text 水印文字
* @param fontSize 字体大小
*/
public static void addTextWatermark(String sourcePath, String targetPath,
String text, int fontSize) {
try {
// 读取原图片
File sourceFile = new File(sourcePath);
BufferedImage originalImage = ImageIO.read(sourceFile);
// 创建图形对象
Graphics2D graphics2D = (Graphics2D) originalImage.getGraphics();
// 设置抗锯齿
graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
graphics2D.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
// 设置字体和颜色
Font font = new Font("微软雅黑", Font.BOLD, fontSize);
graphics2D.setFont(font);
graphics2D.setColor(new Color(255, 255, 255, 128)); // 白色半透明
// 计算文字位置(右下角)
FontMetrics fontMetrics = graphics2D.getFontMetrics();
int textWidth = fontMetrics.stringWidth(text);
int textHeight = fontMetrics.getHeight();
int x = originalImage.getWidth() - textWidth - 20;
int y = originalImage.getHeight() - textHeight - 20;
// 绘制文字水印
graphics2D.drawString(text, x, y);
// 释放资源
graphics2D.dispose();
// 输出图片
ImageIO.write(originalImage, "jpg", new File(targetPath));
System.out.println("文字水印添加成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
addTextWatermark("input.jpg", "output_text.jpg", "© 我的水印", 36);
}
}
图片水印添加
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class ImageWatermark {
/**
* 添加图片水印
* @param sourcePath 原图路径
* @param watermarkPath 水印图路径
* @param targetPath 目标路径
* @param opacity 透明度(0.0-1.0)
*/
public static void addImageWatermark(String sourcePath, String watermarkPath,
String targetPath, float opacity) {
try {
// 读取原图和水印图
BufferedImage originalImage = ImageIO.read(new File(sourcePath));
BufferedImage watermarkImage = ImageIO.read(new File(watermarkPath));
// 创建图形对象
Graphics2D graphics2D = (Graphics2D) originalImage.getGraphics();
// 设置透明度
graphics2D.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, opacity));
// 计算水印位置(右下角)
int watermarkWidth = watermarkImage.getWidth();
int watermarkHeight = watermarkImage.getHeight();
int x = originalImage.getWidth() - watermarkWidth - 20;
int y = originalImage.getHeight() - watermarkHeight - 20;
// 绘制水印
graphics2D.drawImage(watermarkImage, x, y, null);
// 释放资源
graphics2D.dispose();
// 输出图片
ImageIO.write(originalImage, "jpg", new File(targetPath));
System.out.println("图片水印添加成功!");
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
addImageWatermark("input.jpg", "watermark.png", "output_image.jpg", 0.5f);
}
}
高级功能:平铺水印
public class TileWatermark {
/**
* 平铺水印(重复铺满整个图片)
*/
public static void addTileWatermark(String sourcePath, String watermarkPath,
String targetPath, float opacity) {
try {
BufferedImage originalImage = ImageIO.read(new File(sourcePath));
BufferedImage watermarkImage = ImageIO.read(new File(watermarkPath));
Graphics2D graphics2D = (Graphics2D) originalImage.getGraphics();
graphics2D.setComposite(AlphaComposite.getInstance(
AlphaComposite.SRC_OVER, opacity));
int watermarkWidth = watermarkImage.getWidth();
int watermarkHeight = watermarkImage.getHeight();
// 平铺水印
for (int y = 0; y < originalImage.getHeight(); y += watermarkHeight + 20) {
for (int x = 0; x < originalImage.getWidth(); x += watermarkWidth + 20) {
graphics2D.drawImage(watermarkImage, x, y, null);
}
}
graphics2D.dispose();
ImageIO.write(originalImage, "jpg", new File(targetPath));
} catch (IOException e) {
e.printStackTrace();
}
}
}
完整的工具类
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class WatermarkUtils {
/**
* 添加水印(支持文字和图片)
* @param sourceFile 源文件
* @param watermarkType 水印类型("text"或"image")
* @param watermarkContent 水印内容(文字内容或图片路径)
* @param position 位置("top-left","top-right","bottom-left","bottom-right","center")
* @param opacity 透明度
*/
public static void addWatermark(File sourceFile, String watermarkType,
String watermarkContent, String position,
float opacity) {
try {
BufferedImage image = ImageIO.read(sourceFile);
Graphics2D g2d = (Graphics2D) image.getGraphics();
// 设置透明度
g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, opacity));
if ("text".equals(watermarkType)) {
// 文字水印
g2d.setFont(new Font("微软雅黑", Font.BOLD, 30));
g2d.setColor(Color.WHITE);
FontMetrics metrics = g2d.getFontMetrics();
int[] pos = calculatePosition(image, position,
metrics.stringWidth(watermarkContent), metrics.getHeight());
g2d.drawString(watermarkContent, pos[0], pos[1]);
} else if ("image".equals(watermarkType)) {
// 图片水印
BufferedImage watermark = ImageIO.read(new File(watermarkContent));
int[] pos = calculatePosition(image, position,
watermark.getWidth(), watermark.getHeight());
g2d.drawImage(watermark, pos[0], pos[1], null);
}
g2d.dispose();
// 保存图片
String outputPath = sourceFile.getParent() + "/watermarked_" + sourceFile.getName();
ImageIO.write(image, "png", new File(outputPath));
} catch (IOException e) {
e.printStackTrace();
}
}
private static int[] calculatePosition(BufferedImage image, String position,
int width, int height) {
int x = 0, y = 0;
int padding = 20;
switch (position) {
case "top-left":
x = padding;
y = padding + height;
break;
case "top-right":
x = image.getWidth() - width - padding;
y = padding + height;
break;
case "bottom-left":
x = padding;
y = image.getHeight() - padding;
break;
case "bottom-right":
x = image.getWidth() - width - padding;
y = image.getHeight() - padding;
break;
case "center":
x = (image.getWidth() - width) / 2;
y = (image.getHeight() - height) / 2;
break;
}
return new int[]{x, y};
}
// 使用示例
public static void main(String[] args) {
// 文字水印
addWatermark(new File("input.jpg"), "text",
"© 我的水印", "bottom-right", 0.5f);
// 图片水印
addWatermark(new File("input.jpg"), "image",
"watermark.png", "center", 0.3f);
}
}
注意事项
- 图片格式支持:确保使用正确的输出格式(jpg、png等)
- 编码问题:中文字体可能需要在特定系统上配置
- 性能考虑:处理大图片时考虑使用缓冲流
- 异常处理:添加完整的异常处理逻辑
这个案例涵盖了Java图片水印添加的常用场景,您可以根据实际需求选择使用。