You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Graphics2D叠加图片与文字时循环生成非首张图片文本重叠问题

问题根源

你在for循环中反复使用了同一个BufferedImage背景实例调用createCompositeImage方法,第一次方法调用完成后,你传入的背景图已经被修改(叠加了上层图片和文本内容),后续调用都是在已经修改过的背景图基础上再次绘制,自然就会出现文本叠加的异常。

解决方案

有两种常用方案可选,你可以根据自己的业务场景选择:

  • 方案1:每次调用方法前重新加载原始背景图
    在for循环的每次迭代中,都重新从本地磁盘/源文件读取原始背景图,保证每次传入方法的都是未被修改的全新背景实例,避免复用修改后的对象。
  • 方案2:方法内先对传入的背景图做深拷贝,在副本上做绘制
    如果不想频繁IO加载背景图,可以在方法内部先复制一份原始背景图的副本,所有绘制操作都在副本上执行,不修改原始背景图的内容,修改后的完整方法如下:
private static void createCompositeImage(BufferedImage originalImage, BufferedImage overlay, String filename, String codigo) throws IOException {
        // 先创建原始背景图的深拷贝
        BufferedImage imageCopy = new BufferedImage(originalImage.getWidth(), originalImage.getHeight(), originalImage.getType());
        Graphics2D copyG = imageCopy.createGraphics();
        copyG.drawImage(originalImage, 0, 0, null);
        copyG.dispose();

        // 后续所有绘制都在副本上操作
        Graphics2D g = imageCopy.createGraphics();
        g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
        g.drawImage(overlay, (imageCopy.getWidth() - overlay.getWidth()),
                (imageCopy.getHeight() - overlay.getHeight())-200, null);

        g.setFont(g.getFont().deriveFont(40f));
        g.drawString("Entrada número: " + codigo, 30, imageCopy.getHeight()-300);
        g.dispose();

        // 输出副本内容
        ImageIO.write(imageCopy, "jpeg", new File(filename + ".jpeg"));
}

内容的提问来源于stack exchange,提问作者Ana Cruz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 07:45:04