logo

手把手教你Java实现图片文字与水印添加

作者:十万个为什么2025.10.11 22:23浏览量:13

简介:本文通过Java代码示例,详细讲解如何使用Java为图片添加文字水印和图片水印,涵盖BufferedImage、Graphics2D、字体设置、透明度调整等核心实现细节。

手把手教你Java实现图片文字与水印添加

摘要

在Java开发中,为图片添加文字或图片水印是常见的需求,例如生成带版权信息的图片、防止图片盗用或批量处理图片。本文将通过详细的代码示例,逐步讲解如何使用Java标准库(AWT/ImageIO)实现文字水印和图片水印的添加,涵盖字体设置、透明度调整、位置控制等核心功能,并提供完整的代码实现和优化建议。

一、准备工作与环境配置

1.1 开发环境要求

  • JDK 8或更高版本(推荐JDK 11+)
  • 支持AWT和ImageIO库(Java标准库自带)
  • 图片处理工具(如Photoshop用于验证效果)

1.2 依赖说明

本文使用纯Java标准库实现,无需额外依赖。若需更高级功能(如EXIF信息处理),可引入Apache Commons Imaging或TwelveMonkeys ImageIO等库。

1.3 示例图片准备

准备两张测试图片:

  • source.jpg:原始图片(建议尺寸800x600)
  • watermark.png:透明背景的水印图片(建议尺寸200x50)

二、文字水印实现详解

2.1 核心实现步骤

  1. 加载原始图片
  2. 创建Graphics2D对象
  3. 设置字体、颜色和透明度
  4. 绘制文字
  5. 保存结果图片

2.2 完整代码示例

  1. import java.awt.*;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import javax.imageio.ImageIO;
  6. public class TextWatermark {
  7. public static void addTextWatermark(File sourceFile, File outputFile,
  8. String text, Color color, Font font, float alpha,
  9. int positionX, int positionY) throws IOException {
  10. // 1. 加载原始图片
  11. BufferedImage sourceImage = ImageIO.read(sourceFile);
  12. int width = sourceImage.getWidth();
  13. int height = sourceImage.getHeight();
  14. // 2. 创建支持透明度的图片
  15. BufferedImage bufferedImage = new BufferedImage(
  16. width, height, BufferedImage.TYPE_INT_RGB);
  17. Graphics2D g2d = bufferedImage.createGraphics();
  18. // 3. 绘制原始图片
  19. g2d.drawImage(sourceImage, 0, 0, null);
  20. // 4. 设置水印属性
  21. g2d.setColor(color);
  22. g2d.setFont(font);
  23. // 5. 设置透明度
  24. AlphaComposite alphaComposite = AlphaComposite.getInstance(
  25. AlphaComposite.SRC_OVER, alpha);
  26. g2d.setComposite(alphaComposite);
  27. // 6. 计算文字位置(居中示例)
  28. FontMetrics fontMetrics = g2d.getFontMetrics();
  29. int textWidth = fontMetrics.stringWidth(text);
  30. int textHeight = fontMetrics.getHeight();
  31. if (positionX == -1 && positionY == -1) { // 自动居中
  32. positionX = (width - textWidth) / 2;
  33. positionY = (height - textHeight) / 2 + fontMetrics.getAscent();
  34. }
  35. // 7. 绘制文字
  36. g2d.drawString(text, positionX, positionY);
  37. // 8. 释放资源并保存
  38. g2d.dispose();
  39. ImageIO.write(bufferedImage, "jpg", outputFile);
  40. }
  41. public static void main(String[] args) {
  42. try {
  43. File sourceFile = new File("source.jpg");
  44. File outputFile = new File("output_text.jpg");
  45. // 水印参数
  46. String text = "Sample Watermark";
  47. Color color = new Color(255, 255, 255, 150); // 半透明白色
  48. Font font = new Font("Arial", Font.BOLD, 36);
  49. float alpha = 0.5f; // 50%透明度
  50. addTextWatermark(sourceFile, outputFile, text, color,
  51. font, alpha, -1, -1); // -1表示自动居中
  52. System.out.println("文字水印添加成功!");
  53. } catch (IOException e) {
  54. e.printStackTrace();
  55. }
  56. }
  57. }

2.3 关键参数说明

  • 字体设置:通过Font类控制字体、样式和大小
  • 颜色与透明度:使用Color(r,g,b,a)构造半透明颜色
  • 位置控制:支持绝对坐标或自动居中
  • 旋转效果(扩展):通过AffineTransform实现旋转文字

三、图片水印实现详解

3.1 核心实现步骤

  1. 加载原始图片和水印图片
  2. 创建Graphics2D对象
  3. 设置水印图片透明度
  4. 计算水印位置(平铺或单次)
  5. 绘制水印图片
  6. 保存结果图片

3.2 完整代码示例

  1. import java.awt.*;
  2. import java.awt.image.BufferedImage;
  3. import java.io.File;
  4. import java.io.IOException;
  5. import javax.imageio.ImageIO;
  6. public class ImageWatermark {
  7. public static void addImageWatermark(File sourceFile, File outputFile,
  8. File watermarkFile, float alpha, int positionX, int positionY,
  9. boolean tile) throws IOException {
  10. // 1. 加载原始图片和水印
  11. BufferedImage sourceImage = ImageIO.read(sourceFile);
  12. BufferedImage watermarkImage = ImageIO.read(watermarkFile);
  13. int sourceWidth = sourceImage.getWidth();
  14. int sourceHeight = sourceImage.getHeight();
  15. int watermarkWidth = watermarkImage.getWidth();
  16. int watermarkHeight = watermarkImage.getHeight();
  17. // 2. 创建支持透明度的图片
  18. BufferedImage bufferedImage = new BufferedImage(
  19. sourceWidth, sourceHeight, BufferedImage.TYPE_INT_RGB);
  20. Graphics2D g2d = bufferedImage.createGraphics();
  21. // 3. 绘制原始图片
  22. g2d.drawImage(sourceImage, 0, 0, null);
  23. // 4. 设置水印透明度
  24. AlphaComposite alphaComposite = AlphaComposite.getInstance(
  25. AlphaComposite.SRC_OVER, alpha);
  26. g2d.setComposite(alphaComposite);
  27. // 5. 绘制水印(单次或平铺)
  28. if (tile) { // 平铺模式
  29. for (int x = 0; x < sourceWidth; x += watermarkWidth) {
  30. for (int y = 0; y < sourceHeight; y += watermarkHeight) {
  31. g2d.drawImage(watermarkImage, x, y, null);
  32. }
  33. }
  34. } else { // 单次模式
  35. int x = positionX;
  36. int y = positionY;
  37. if (positionX == -1 && positionY == -1) { // 自动居中
  38. x = (sourceWidth - watermarkWidth) / 2;
  39. y = (sourceHeight - watermarkHeight) / 2;
  40. }
  41. g2d.drawImage(watermarkImage, x, y, null);
  42. }
  43. // 6. 释放资源并保存
  44. g2d.dispose();
  45. ImageIO.write(bufferedImage, "jpg", outputFile);
  46. }
  47. public static void main(String[] args) {
  48. try {
  49. File sourceFile = new File("source.jpg");
  50. File outputFile = new File("output_image.jpg");
  51. File watermarkFile = new File("watermark.png");
  52. // 水印参数
  53. float alpha = 0.3f; // 30%透明度
  54. addImageWatermark(sourceFile, outputFile, watermarkFile,
  55. alpha, -1, -1, false); // false表示单次水印
  56. System.out.println("图片水印添加成功!");
  57. } catch (IOException e) {
  58. e.printStackTrace();
  59. }
  60. }
  61. }

3.3 关键参数说明

  • 平铺模式:通过双重循环实现全图覆盖
  • 位置计算:支持绝对坐标或自动居中
  • 透明度控制:与文字水印相同的AlphaComposite机制
  • 水印尺寸:可调整水印图片大小(扩展功能)

四、高级功能与优化建议

4.1 性能优化

  • 批量处理:使用多线程处理大量图片
  • 内存管理:及时释放Graphics2D和BufferedImage对象
  • 缓存机制:对重复使用的水印图片进行缓存

4.2 扩展功能

  • 动态文字:根据图片EXIF信息添加动态内容
  • 多水印支持:同时添加文字和图片水印
  • 格式支持:扩展支持PNG、WEBP等格式

4.3 常见问题解决方案

  • 中文乱码:指定中文字体如"Microsoft YaHei"
  • 透明背景处理:使用BufferedImage.TYPE_INT_ARGB
  • 大图处理:分块处理避免内存溢出

五、完整项目结构建议

  1. image-watermark/
  2. ├── src/
  3. ├── main/
  4. ├── java/
  5. └── com/example/
  6. ├── TextWatermark.java
  7. └── ImageWatermark.java
  8. └── resources/
  9. └── watermark.png
  10. └── test/
  11. └── java/
  12. └── com/example/
  13. └── WatermarkTest.java
  14. └── pom.xml (Maven项目)

六、总结与最佳实践

  1. 代码复用:将水印功能封装为工具类
  2. 参数配置:通过配置文件管理水印参数
  3. 异常处理:完善IO和图片格式异常处理
  4. 测试验证:使用不同尺寸和格式的图片进行测试

通过本文的详细讲解和完整代码示例,开发者可以快速掌握Java实现图片水印的核心技术,并根据实际需求进行扩展和优化。

相关文章推荐

发表评论

活动