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
相关产品推荐
相关产品推荐

