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

