Java实现图片添加文字水印的代码示例

作者:袖梨 2026-05-27
在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类、设置透明度参数以及处理文字位置计算,这些技巧可以帮助开发者创建出更加专业的水印效果。

相关文章

精彩推荐