最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Java实现图片添加文字水印的代码示例
时间:2026-05-27 11:00:02 编辑:袖梨 来源:一聚教程网
在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;
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);
}
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();
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;
}
public static void closeFileInputStream (FileInputStream fis){
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
如需获取系统可用字体列表,可使用以下代码:
import java.awt.*;
public class FontDemo {
public static void main(String[] args) {
Font[] fonts = GraphicsEnvironment
.getLocalGraphicsEnvironment()
.getAllFonts();
for (Font font : fonts) {
System.out.println(font.getFontName());
}
}
}
进阶功能:
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 {
public static void addTextWatermark(String srcImageFile, String destImageFile,
String watermarkText, int x, int y,
int fontSize, float alpha, double angle) throws IOException {
BufferedImage image = ImageIO.read(new File(srcImageFile));
int width = image.getWidth();
int height = image.getHeight();
Graphics2D g2d = image.createGraphics();
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
Font font = new Font("宋体", Font.BOLD, fontSize);
g2d.setFont(font);
g2d.setColor(Color.WHITE);
AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
g2d.setComposite(alphaComposite);
if (angle != 0) {
g2d.rotate(angle, x + (fontSize * watermarkText.length()) / 4.0, y + fontSize / 2.0);
}
g2d.drawString(watermarkText, x, y);
g2d.dispose();
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;
double angle = Math.toRadians(30);
g2d.rotate(angle, width / 2.0, height / 2.0);
g2d.drawString(watermarkText, centerX, centerY);
常见问题解答:
问题解决方案中文乱码使用支持中文的字体,如"宋体"、"Microsoft YaHei"等。文字锯齿开启抗锯齿功能。透明背景调整alpha值控制透明度。保存格式建议使用PNG或JPG格式。性能优化预计算字体参数避免重复创建。
扩展功能封装:
public class WatermarkUtil {
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;
}
}
通过本文介绍的方法,开发者可以轻松实现图片水印功能,满足版权保护、图片标记等常见需求。核心要点包括正确使用Graphics2D类、设置透明度参数以及处理文字位置计算,这些技巧可以帮助开发者创建出更加专业的水印效果。