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

时间:2017-08-25 09:33:22

标签: python python-3.x python-imaging-library

我正在尝试根据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

相反

4 个答案:

答案 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,你可以

  1. 使用getTextSize检查文本大小
  2. 使用numpy.ones创建白色图像((高度,宽度,3),np.uint8)* 255

  3. 使用putText,

  4. 向图像添加文本
  5. 使用imwrite保存图像。
  6. 请参阅herehere以获取参考资料。

答案 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')