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

 更新时间:2026年05月27日 09:04:39   作者:浮云6363  
本文介绍了一个使用Java实现的图片水印工具,该工具能够读取指定路径的图片,在图片上添加文字水印,并将带有水印的图片保存到指定路径,感兴趣的小伙伴可以了解下

本文介绍了一个使用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;

/**
 * @Author: 浮云
 * @Date: 2019/12/21 21:51
 */
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);
    }

    /**
     * @param filePath 原图片
     * @param outFile  输出图片
     * @param text     水印文字
     * @param color    颜色
     * @param font     字体
     * @param x        水印起始X坐标
     * @param y        水印起始Y坐标
     * @return 添加水印是否成功 true-成功 false-失败
     */
    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();//原图片高
            //判断水印起始x和y坐标是否小于原图片宽和高
            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;
    }

    /**
     * 关闭文件输入流
     * @param fis
     */
    public static void closeFileInputStream (FileInputStream fis){
        if (fis != null) {
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

如果不知道有哪些字体,可以用以下代码打印所有字体

import java.awt.*;

/**
 * @Author: 浮云
 * @Date: 2019/12/22 0:23
 */
public class FontDemo {
    public static void main(String[] args) {
        Font[] fonts = GraphicsEnvironment
                .getLocalGraphicsEnvironment()
                .getAllFonts();
        for (Font font : fonts) {
            System.out.println(font.getFontName());
        }
    }
}

知识补充:

在 Java 中为图片添加文字水印是非常常见的需求,通常使用 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 {

    /**
     * 为图片添加文字水印
     *
     * @param srcImageFile  源图片文件路径
     * @param destImageFile 目标图片文件路径
     * @param watermarkText 水印文字
     * @param x             水印左上角 X 坐标(相对原图)
     * @param y             水印左上角 Y 坐标
     * @param fontSize      字体大小(像素)
     * @param alpha         透明度 (0.0 ~ 1.0)
     * @param angle         旋转弧度(0 表示不旋转)
     */
    public static void addTextWatermark(String srcImageFile, String destImageFile,
                                        String watermarkText, int x, int y,
                                        int fontSize, float alpha, double angle) throws IOException {
        // 1. 读取原图
        BufferedImage image = ImageIO.read(new File(srcImageFile));
        int width = image.getWidth();
        int height = image.getHeight();

        // 2. 创建 Graphics2D 对象
        Graphics2D g2d = image.createGraphics();

        // 开启抗锯齿,让文字边缘更平滑
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

        // 3. 设置字体和颜色
        Font font = new Font("宋体", Font.BOLD, fontSize);
        g2d.setFont(font);
        g2d.setColor(Color.WHITE);      // 文字颜色

        // 4. 设置透明度(AlphaComposite)
        AlphaComposite alphaComposite = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
        g2d.setComposite(alphaComposite);

        // 5. 旋转文字(如果需要)
        if (angle != 0) {
            g2d.rotate(angle, x + (fontSize * watermarkText.length()) / 4.0, y + fontSize / 2.0);
        }

        // 6. 绘制水印文字
        g2d.drawString(watermarkText, x, y);

        // 7. 释放资源
        g2d.dispose();

        // 8. 保存新图片
        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;  // 视觉居中

// 旋转 30 度(弧度制)
double angle = Math.toRadians(30);
g2d.rotate(angle, width / 2.0, height / 2.0);
g2d.drawString(watermarkText, centerX, centerY);

常见问题与注意事项

问题解决方案
中文乱码确保使用的字体支持中文(如 "宋体""Microsoft YaHei""SimHei"),不要用 "Arial"
文字锯齿开启抗锯齿提示:g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
透明背景图片(PNG)水印会正常叠加,无需特殊处理;如果希望水印也带半透明,调整 alpha 值即可。
保存格式限制某些格式(如 GIF)不支持高精度颜色,建议保存为 PNG 或 JPG。
性能优化若对大量图片添加相同水印,可提前预计算字体和透明度,避免在循环中重复创建 Font 对象。

扩展:水印工具类封装(支持更多参数)

public class WatermarkUtil {
    /**
     * 添加文字水印
     * @param src     源图片路径
     * @param dest    目标路径
     * @param text    水印文字
     * @param config  配置项(位置、字体、颜色、透明度等)
     */
    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;
        // ... getter / setter
    }
}

总结

  • 核心步骤ImageIO.read → Graphics2D → 设置透明度和字体 → drawString → ImageIO.write
  • 关键技巧:使用 AlphaComposite 实现半透明效果;利用 FontMetrics 精确计算文字尺寸;开启抗锯齿提升显示质量。
  • 适用场景:图片版权保护、分享标记、上传预览图标识等。

到此这篇关于Java实现在图片中添加文字水印的示例代码的文章就介绍到这了,更多相关Java图片添加文字水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot与Kafka整合方案

    SpringBoot与Kafka整合方案

    本文将带你全面掌握SpringBoot与Kafka 的整合方案,从环境搭建到高级特性,从代码实现到性能调优,让你既能理解底层原理,又能解决实际开发中的各种问题,本文给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • Hibernate初体验及简单错误排除代码详解

    Hibernate初体验及简单错误排除代码详解

    这篇文章主要介绍了Hibernate初体验及简单错误排除代码详解,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • SpringBoot中Zookeeper分布式锁的原理和用法详解

    SpringBoot中Zookeeper分布式锁的原理和用法详解

    Zookeeper是一个分布式协调服务,它提供了高可用、高性能、可扩展的分布式锁机制,SpringBoot是一个基于Spring框架的开发框架,它提供了对Zookeeper分布式锁的集成支持,本文将介绍SpringBoot中的 Zookeeper分布式锁的原理和使用方法,需要的朋友可以参考下
    2023-07-07
  • 10个SpringBoot参数验证你需要知道的技巧分享

    10个SpringBoot参数验证你需要知道的技巧分享

    参数验证很重要,是平时开发环节中不可少的一部分,那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧,你知道几个呢
    2023-03-03
  • Java IO流 文件传输基础

    Java IO流 文件传输基础

    这篇文章主要介绍了Java IO流 文件传输基础的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • Java IO读取文件的实例详解

    Java IO读取文件的实例详解

    这篇文章主要介绍了Java IO读取文件的实例详解的相关资料,主要介绍字符流和字节流的内容,需要的朋友可以参考下
    2017-07-07
  • Spring、SpringMVC和SpringBoot的区别及说明

    Spring、SpringMVC和SpringBoot的区别及说明

    这篇文章主要介绍了Spring、SpringMVC和SpringBoot的区别及说明,具有很好的参考价值,希望对大家有所帮助。
    2022-10-10
  • java比较两个list是否相同equals的代码详解

    java比较两个list是否相同equals的代码详解

    在本篇文章里小编给大家分享的是关于java比较两个list是否相同equals的代码详解,有需要的朋友们可以参考学习下。
    2020-02-02
  • Java实现的猴子吃桃问题算法示例

    Java实现的猴子吃桃问题算法示例

    这篇文章主要介绍了Java实现的猴子吃桃问题算法,简单描述了猴子吃桃问题并结合实例形式给出了java解决猴子吃桃问题的具体实现技巧,需要的朋友可以参考下
    2017-10-10
  • 详解在Java的Struts2框架中配置Action的方法

    详解在Java的Struts2框架中配置Action的方法

    这篇文章主要介绍了详解在Java的Struts2框架中配置Action的方法,讲解了包括struts.xml中的action配置及基于注解方式Action配置的两个方式,需要的朋友可以参考下
    2016-03-03

最新评论