java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java图片添加文字水印

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

作者:浮云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
    }
}

总结

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

您可能感兴趣的文章:
阅读全文