如何锚定文本并将其缩小以适合图像

How do I Anchor Text and Shrink it to fit it on an Image

我从 PIL API(这里是 link: https://pillow.readthedocs.io/en/stable/handbook/text-anchors.html)中找到这段代码,我还想根据文本的大小缩小它居中。

这里是锚定代码

from PIL import Image, ImageDraw, ImageFont

font = ImageFont.truetype("mont.ttf", 48)
im = Image.new("RGB", (200, 200), "white")
d = ImageDraw.Draw(im)
d.text((100, 100), "Quick", fill="black", anchor="ms", font=font)
im.save('text.png')

结果是这样的:

但是如果你增加字的大小,它看起来像这样:

所以我只希望文本居中并缩小以适合图像

没有具体要求,所以这里只针对固定大小(200, 200)的结果图,所以字体大小会改变。

  • 通过ImageDraw.textsize
  • 查找文本大小
  • 通过ImageDraw.text
  • 在与文本宽度相同的图像上绘制
  • 通过 Image.resize
  • 将图像大小调整为 (200-2*border, 200-2*border)
  • 通过 Image.paste
  • 将调整后的图片粘贴为 200x200 图片
from PIL import Image, ImageDraw, ImageFont

def text_to_image(text, filename='text.png', border=20):
    im = Image.new("RGB", (1, 1), "white")
    font = ImageFont.truetype("calibri.ttf", 48)
    draw = ImageDraw.Draw(im)
    size = draw.textsize(text, font=font)
    width = max(size)
    im = Image.new("RGB", (width, width), "white")
    draw = ImageDraw.Draw(im)
    draw.text((width//2, width//2), text, anchor='mm', fill="black", font=font)
    im = im.resize((200-2*border, 200-2*border), resample=Image.LANCZOS)
    new_im = Image.new("RGB", (200, 200), "white")
    new_im.paste(im, (border, border))
    new_im.show()
    # new_im.save(filename)

text_to_image("Hello World")