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

使用Pillow在图片上绘制文本时的文本叠加问题求助

图片文本叠加问题的分析与解决

问题原因

你遇到的第2至第5张图片文本叠加的问题,核心原因是循环外仅加载了一次原图对象img,每次循环都在已经绘制过文本的图片上继续绘制新内容,导致后续图片保留了之前所有的绘制痕迹。

原代码问题点

原代码中,img = Image.open("testpic.jpg")和draw = ImageDraw.Draw(img)都在循环外部初始化,所有循环迭代的绘制操作都作用于同一个图片对象,每次保存的都是这个被多次修改后的图片,自然会出现文本叠加。

正确解决方案

方案1:每次循环重新加载原图

将打开图片的逻辑放到循环内部,确保每次绘制都基于干净的原图:

# 初始化固定变量
f = open("text.txt", "r")
img_center = (215, 190)
fnt = ImageFont.truetype('arial.ttf', 32)

# 循环生成图片
for i in range(1, 6):
    img = Image.open("testpic.jpg")  # 每次循环重新加载原图
    draw = ImageDraw.Draw(img)
    img_txt = f.readline()
    draw.text(img_center, img_txt, font=fnt, stroke_fill=(0, 0, 0))
    img.save(f'Image{i}.png')

# 记得关闭文件
f.close()

方案2:基于原图副本绘制

如果不想重复加载图片(比如原图较大时),可以在循环内创建原图的副本,基于副本进行绘制:

# 初始化固定变量
f = open("text.txt", "r")
original_img = Image.open("testpic.jpg")
img_center = (215, 190)
fnt = ImageFont.truetype('arial.ttf', 32)

# 循环生成图片
for i in range(1, 6):
    img = original_img.copy()  # 创建原图的全新副本
    draw = ImageDraw.Draw(img)
    img_txt = f.readline()
    draw.text(img_center, img_txt, font=fnt, stroke_fill=(0, 0, 0))
    img.save(f'Image{i}.png')

# 记得关闭文件
f.close()

关于你提到的i=+1

你说添加i=+1解决了问题,这应该是误操作——这个语句对循环逻辑没有实际影响,真正解决问题的可能是你修改代码时无意中调整了图片加载的位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 02:45:35