本文目录导读:

我来为您介绍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图片水印添加的常用场景,您可以根据实际需求选择使用。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播