我正在尝试根据draw.text()
提供的字体和文字动态增加图像大小。
Orignal问题是根据名称和用户选择的字体创建签名图像。
这是我的代码
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')
但我仍然在宽度和高度上定义相同的图像大小。我们可以根据字体及其大小动态调整图像大小吗?
注意:此问题与this stackoverflow question
相反答案 0 :(得分:13)
不幸的是,没有人能够回答我的问题。
基本上,在设置字体大小时,您无法设置固定宽度和高度。两者都相互依赖。因此,如果一个增加,第二个也增加。
所以我想出了另一个解决方案。我只是设置字体大小然后根据该字体大小,我设置宽度和高度。
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')
答案 1 :(得分:3)
如果你可以使用openCV和numpy,你可以
答案 2 :(得分:2)
首先,你需要让你的音阶正确:你是从一个以磅为单位给出的字体大小开始的,它被定义为1/72英寸;那些是“现实世界”的尺度。您正在绘制的图像以像素为单位定义。仅当您还定义每英寸像素比率时,像素才会获得与英寸/点的关系。
因此,您对该问题的思考方式有点落后:您需要从您拥有的像素开始(从源图像或目标图像开始),然后计算适当的字体大小。如果您想让用户选择字体大小,您需要定义(或要求)目标DPI值,以便在所涉及的比例单位之间进行更改。
答案 3 :(得分:2)
您正在寻找的功能是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')