PIL如何根据在图像上绘制的文本来缩放图像

15

我试图根据传递给draw.text()的字体和文本动态增加图像大小。

原始问题是基于用户选择的字体和名称创建签名图像。

这是我的代码:

from PIL import (Image, ImageDraw, ImageFont,)

width=20
height=20
selected_font='simply_glomrous.ttf'
font_size=30

img = Image.new('RGBA', (width, height), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), "Adil Malik", (0,0,0), font)
img.save('signature.png')
但是我仍然在使用宽度和高度定义的相同图像尺寸。我们可以根据字体及其大小动态调整图像大小吗?注意:这个问题与 这个 stackoverflow 问题 相反。
4个回答

14

很遗憾,没有人能回答我的问题。

基本上,在设置字体大小时无法设置固定的宽度和高度。两者相互依赖。因此,如果一个增加,另一个也会增加。

所以我想出了另一个解决方案。我只设置字体大小,然后根据该字体大小设置宽度和高度。

from PIL import (Image, ImageDraw, ImageFont,)

name = 'Adil Malik'
selected_font='simply_glomrous.ttf'
font_size=30

font = ImageFont.truetype(selected_font, font_size)
font_size = font.getsize(name)

img = Image.new('RGBA', (font_size[0], font_size[0]), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), name, (0,0,0), font)
img.save('signature.png')

2
我特别感兴趣的是,我在你提出问题之后五天就回答了它,但可惜没有人能够回答我的问题。 - Jonny Morrill

4
您要查找的功能是 Draw.textsize 方法,它以文本字符串和绘制选项作为输入,并返回呈现文本的宽度和高度。

http://effbot.org/imagingbook/imagedraw.htm#tag-ImageDraw.Draw.textsize

你可以使用具有零宽度和高度的图像的Draw类,然后调用方法来确定要呈现的文本的尺寸。一旦知道这些尺寸,就可以相应地调整图像大小。例如:
from PIL import ImageDraw, ImageFont, Image

# parameters
text = "My Name"
selected_font = "simply_glomrous.ttf"
font_size = 30

# get the size of the text
img = Image.new('RGBA', (0,0), (255, 255, 255, 0))
font = ImageFont.truetype(selected_font, font_size)
draw = ImageDraw.Draw(img)
text_size = draw.textsize(text, font)

# resize and draw
img = img.resize(text_size)
draw.text((0,0), text, (0,0,0), font)
img.save('signature.png')

1
嗨!谢谢你的解决方案。我尝试使用你的代码,但是遇到了一个小问题。没有文字显示出来。我不得不在调整大小后再次绘制= ImageDraw.Draw(img),然后它就可以工作了。也许版本差异导致了这个问题。 - cd80

3
如果您能够使用OpenCV和NumPy,那么您可以:
  1. 使用getTextSize检查文本大小
  2. 使用numpy.ones((height, width, 3), np.uint8)*255创建一个白色图像
  3. 使用putText将文本添加到图像中
  4. 使用imwrite保存图像。
参考资料请看这里这里

2
首先,你需要正确理解比例尺:你的起点是以点为单位给出的字体大小,而点的定义是1/72英寸。这些都是“真实世界”的比例尺。你正在绘制的图像是以像素为单位定义的。只有当你也定义了每英寸像素数时,像素才与英寸/点相关联。
因此,你思考问题的方式有点反向:你需要从你拥有的像素(无论是源图像还是目标图像)开始计算出适当的字体大小。如果你想让用户选择字体大小,你需要定义(或询问)目标DPI值,以便在涉及到的比例单位之间进行转换。

但是,我的问题仍然存在。我不知道文本的长度会是多少。所以我不能用固定的图像尺寸开始。 - Mahammad Adil Azeem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接