这是一篇关于怎么尽可能的用尽你电脑里的所有字体给你的图片加水印。。。。
先上效果~
当然这只是其中一部分字体,,,我也是今天才发现我电脑里居然装了那么多字体 ==
好了废话不多说直接上完整代码~
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;
}
搞定撒花*★,°* :.☆( ̄▽ ̄)/$:.°★ 。