【Java】如何给你的图片添加自定义水印(附完整代码)?

这是一篇关于怎么尽可能的用尽你电脑里的所有字体给你的图片加水印。。。。

先上效果~

当然这只是其中一部分字体,,,我也是今天才发现我电脑里居然装了那么多字体 ==

好了废话不多说直接上完整代码~

Java 复制代码
import io.swagger.models.auth.In;

import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

/**
*  @Description
 *  @Author  aqin1012 AQin.
*  @Date  12/29/23 5:38 PM
*  @Version  1.0
*/
public class AddTextWatermark {
    static String imagePath = "/Users/aqin1012/Pictures/20231220-111041.jpeg"; // 图片路径
    static String text = "AQin.AI"; // 水印文字
    static Integer FONT_SIZE = 70;


    public static void main(String[] args) {
        String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
        for (String fontName : fontNames) {
            System.out.println(fontName);
            String outputImagePath = "/Users/aqin1012/Pictures/20231220-111041-" + fontName + ".jpeg"; // 输出图片路径
            addWatermark(fontName, outputImagePath);
        }
    }

    private static void addWatermark(String fontName, String outputImagePath) {
        Font font = new Font(fontName, Font.BOLD, FONT_SIZE); // 指定字体样式

        try {
            File imageFile = new File(imagePath);
            BufferedImage image = ImageIO.read(imageFile);

            Graphics2D g2d = (Graphics2D) image.getGraphics();
            g2d.setFont(font);
            g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);

            // 计算文字位置
            FontMetrics fontMetrics = g2d.getFontMetrics(font);
            Rectangle2D rect = fontMetrics.getStringBounds(text, g2d);
            int centerX = (image.getWidth() - (int) rect.getWidth()) / 10;
            int centerY = (image.getHeight() - (int) rect.getHeight()) / 10 * 9 + fontMetrics.getAscent();

            // 添加文字水印
            g2d.setColor(Color.white); // 水印文字的颜色
            g2d.drawString(text, centerX, centerY);
            g2d.dispose();

            // 保存图片
            ImageIO.write(image, "jpg", new File(outputImagePath));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

这段代码用到了Graphics2D,Graphics2D是Java中用于绘图的工具类,是Graphics类的扩展,可以绘制形状、图像、文本等各种二维内容,上面的代码的逻辑是先搜索你电脑里都安装了哪些字体,然后依次用这些字体在特定的位置给特定地址的图片加上特定的文字水印~ 当然如果想批量就在外面搞个循环读取文件夹里的所有图片,如果想要修改水印位置就可以修改代码里的centerX和centerY,比如下面这个~~

就是在原有的基础上添加了透明度和循环

Java 复制代码
g2d.setColor(new Color(255, 255, 255, 128)); // 水印文字的颜色(红色,半透明)
while (centerX < image.getWidth()) {
    while (centerY < image.getHeight()) {
        g2d.drawString(text, centerX, centerY);
        centerY += fontMetrics.getAscent() * 2;
    }
    centerX += 300;
    centerY = 0;
}

搞定撒花*★,°* :.☆( ̄▽ ̄)/$:.°★

相关推荐
折哥的程序人生 · 物流技术专研2 分钟前
《Java 100 天进阶之路》第23篇:缓冲区数据结构 ByteBuffer
java·开发语言·数据结构·后端·面试·求职招聘
还是鼠鼠5 分钟前
AI掘金头条新闻系统 (Toutiao News)-获取新闻分类
后端·python·mysql·fastapi·web
REDcker7 分钟前
C++循环与编译器优化详解 别名不变量向量化与GCC Clang验证及perf实践
java·jvm·c++·c·clang·gcc
高斯林.神犇21 分钟前
Idea中使用Git
java·ide·intellij-idea
超梦dasgg37 分钟前
Spring Security 原理 + 生产环境认证授权实战
java·后端·spring
wand codemonkey42 分钟前
【第五步+前后分离调】最后的联动调试--java+Vue3项目
java·开发语言·vue.js
东方小月43 分钟前
Claude Code Skill 完全指南:一个 markdown 文件,就是一个专家分身
前端·后端
JunLa44 分钟前
L angGraph vs 链式调用
java·网络·数据库
DianSan_ERP1 小时前
抖店订单接口中消费者信息加密解密机制与安全履约全解析
前端·网络·数据库·后端·安全·团队开发·运维开发
晚风烟火1 小时前
从“落地实践”和“应试通关”两个维度,拆解每一章到底要掌握什么
java