基于Java8实现实时文字嵌入图片,含图片拼接,文字自动换行

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();
        }
    }
}

说明:

文字距离左上角距离怎么看?

鼠标右键你的底图,选择打开方式为画图:

鼠标移动,会发现左下角坐标,你文字想放图片哪就把鼠标移到哪,然后看坐标即可:

注意,一定要在你设置的位置放置原图!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值