【问题标题】:Drawing text on images in pillow在枕头上的图像上绘制文字
【发布时间】:2023-01-26 21:24:10
【问题描述】:

我试图解决我在代码中遇到的一个问题,该代码应该从图片上的文本文件中绘制文本。我遇到的问题是程序在第一张图片(2、3、4、5)之后的每张图片中将所有文本相互堆叠。我无法解释是什么问题所以我就留下照片(https://i.stack.imgur.com/nkY2O.png

#vars
f = open("text.txt","r")
img = Image.open("testpic.jpg")
draw = ImageDraw.Draw(img)
img_center = (215,190)
fnt = ImageFont.truetype('arial.ttf',32)

#code
for i in range(1,6):
    img_txt = (f.readline())
    draw.text(img_center, img_txt, font=fnt, stroke_fill=(0, 0, 0))
    img.save('Image'+str(i)+'.png')

我试图将图像文本更改为 f.readlines() 但问题仍然存在。

问题已经解决了一段时间,但我不知道如何关闭这个问题

【问题讨论】:

  • 我看不出问题是什么,或者实际问题是什么。你的意思是因为你把它们都画在同一个地方,所以文本会出现在彼此之上吗?
  • 是的,文本相互重叠。但我不希望这种情况发生 我希望文本文件中的每一行都在一个图像中
  • text.txt 文件中有什么?
  • 因为你一次又一次地在同一张图片上作画。每个draw.text 都绘制在已经修改过的图像之上。如果您不希望这种情况发生,那么在每次循环中,您都必须重新读取未修改的源图像。并实例化一个新的 ImageDraw。
  • 另外,请在打开文件时使用上下文管理器...而不是使用.readline(),只需迭代打开的文件。

标签: python python-imaging-library


【解决方案1】:

这是一个非常合理但不太复杂的方法:

#!/usr/bin/env python3

from PIL import Image, ImageDraw, ImageFont

# Generate annotations file with 3 lines
annotations = 'annotations.txt'
with open(annotations, 'w') as f:
    f.write("Merry
Christmas
StackOverflow")

# Open background and get dimensions
im = Image.open("background.jpg")
width, height = im.size

# Make a canvas to draw on, same size as background
# Set up everything necessary outside loop
canvas = im.copy()
draw = ImageDraw.Draw(canvas)
textpos = (int(width/4), int(height/3))
font = ImageFont.truetype('arial.ttf',32)

# Iterate over lines in "annotations.txt"
N = 0
with open(annotations,"r") as f:
   while True:
      text = f.readline()
      if not text:
         break
      # Copy background onto our canvas - thereby clearing previous iteration
      canvas.paste(im)
      draw.text(textpos, text, font=font, stroke_fill=(0, 0, 0))
      canvas.save(f'image-{N}.png')
      N += 1

它产生三个图像:

-rw-r--r--@ 1 mark  staff  2863 29 Nov 16:13 image-0.png
-rw-r--r--@ 1 mark  staff  4134 29 Nov 16:13 image-1.png
-rw-r--r--@ 1 mark  staff  5816 29 Nov 16:13 image-2.png

【讨论】:

    【解决方案2】:

    这是我修改后的代码版本:

    #vars
    img = Image.open("testpic.jpg")
    img_center = (215,190)
    fnt = ImageFont.truetype('arial.ttf',32)
    
    #code
    with open("text.txt", "rt") as f:
        for i, line in enumerate(f, start=1):
            img_copy = img.copy()
            draw = ImageDraw.Draw(img_copy)
            draw.text(img_center, line, font=fnt, stroke_fill=(0, 0, 0))
            img_copy.save(f'Image{i}.png')
            if i == 6:
                break
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-07
      • 1970-01-01
      • 2015-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多