talk is cheap,show me your code!
public class ImageTextAdder {
/**
* 图片添加文字
*
* @param title 标题
* @param content 内容
* @author: Jesse
* @date: 2024/9/19
*/
public static void addTextToImage(String title, String content) throws Exception {
//===========基于现有图片添加文字生成图片===========
File dir = new File("./2025"); //当前目录下创建一个名称为2025的文件夹
if (dir.exists()) {
deleteDirectory(dir);
}
dir.mkdirs();
String s = "请输入你要嵌入的文字内容";
String pic = "./background-20240902.png"; // 原图路径,改成你自己的底图的存放位置+名称
Point site = new Point(72, 413); // 距离左上角距离(详见说明)
String path = "./2025/quakeqw.png"; //合成的图片名称
addText(pic, site, s, path);
//===========生成拼接图片内容,白底黑字==========
// 创建底图,宽度根据原拼接图片宽度,高度视情况自行设置
int width = 1113;
int height = 300;
BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = newImage.createGraphics();
// 设置背景为白色
g2d.setPaint(Color.WHITE);
g2d.fillRect(0, 0, width, height);
// 抗锯齿属性
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 设置字体和绘制标题
Font titleFont = new Font("SIMHEI", Font.PLAIN, 39);
g2d.setFont(titleFont);
g2d.setPaint(Color.BLACK);
g2d.drawString(title, 72, 78);
// 设置字体和绘制内容
Font contentFont = new Font("SIMHEI", Font.PLAIN, 35);
g2d.setFont(contentFont);
String[] lines = wrapText(content, 969, g2d.getFontMetrics()); //实现文字自动换行,其中969是由原图片宽度减去页边距x2得出,相当于正文一行的最大宽度
int lineHeight = g2d.getFontMetrics().getHeight();
int y = 145;
for (String line : lines) {
g2d.drawString(line, 72, y);
y += lineHeight;
}
g2d.dispose();
// 加载已有的图片
BufferedImage existingImage = ImageIO.read(new File("2025/quakeqw.png"));
// 创建新图片用于拼接
BufferedImage combinedImage = new BufferedImage(width, height + existingImage.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D combinedG2d = combinedImage.createGraphics();
// 绘制新创建的图片
combinedG2d.drawImage(existingImage, 0, 0, null);
// 绘制已有的图片
combinedG2d.drawImage(newImage, 0, 622, null); //622是原拼接图片的高度,请依实际修改
combinedG2d.dispose();
// 保存拼接后的图片
ImageIO.write(combinedImage, "png", new File("./2025/quakeqw-text.png")); //保存名字自行修改
}
private static void addText(String pic, Point site, String txt, String path) throws Exception {
// 打开初始文件
BufferedImage image = ImageIO.read(new File(pic));
Graphics2D g2d = image.createGraphics();
// 设置字体
Font font = new Font("SIMHEI", Font.PLAIN, 52); //字体名称自行百度,第二个参数为是否加粗,加粗为BOLD,第三个是字体大小
g2d.setFont(font);
// 设置颜色
Color lightColor = new Color(255, 255, 255, 200); // RGBA, 透明度设置为200
g2d.setColor(lightColor);
// 抗锯齿属性
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); //提升观感
// 输出文字
g2d.drawString(txt, site.x, site.y);
// 保存
ImageIO.write(image, "png", new File(path));
g2d.dispose();
}
private static String[] wrapText(String text, int maxWidth, FontMetrics fontMetrics) {
StringBuilder wrappedText = new StringBuilder();
String[] words = text.split(""); //以每个字符做拆分,可根据实际需求做更改,下同
List<String> lines = new ArrayList<>();
for (String word : words) {
// 检查添加新单词后是否会超过最大宽度
if (wrappedText.length() > 0) {
// 检查加上新单词后的总长度
if (fontMetrics.stringWidth(wrappedText.toString() + word) > maxWidth) {
// 如果超过最大宽度,将当前字符串添加到行列表,并开始新的一行
lines.add(wrappedText.toString());
wrappedText = new StringBuilder(word);
} else {
// 如果不超过最大宽度,添加新单词
wrappedText.append(word);
}
} else {
wrappedText.append(word);
}
}
// 添加最后一行
if (wrappedText.length() > 0) {
lines.add(wrappedText.toString());
}
// 将行列表转换为数组
return lines.toArray(new String[0]);
}
private static void deleteDirectory(File directory) {
if (directory.exists()) {
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
deleteDirectory(file);
} else {
file.delete();
}
}
}
directory.delete();
}
}
}
说明:
文字距离左上角距离怎么看?
鼠标右键你的底图,选择打开方式为画图:
鼠标移动,会发现左下角坐标,你文字想放图片哪就把鼠标移到哪,然后看坐标即可: