【问题标题】:PIL how to scale image in relation to the text drawn on imagePIL如何相对于图像上绘制的文本缩放图像
【发布时间】:2018-02-03 07:59:23
【问题描述】:

我正在尝试根据提供给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')

但我仍然在宽度和高度上定义了相同的图像尺寸。我们可以根据字体及其大小动态调整图像大小吗?

注意:这个问题与this stackoverflow question相反

【问题讨论】:

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


    【解决方案1】:

    首先,您需要正确调整比例:您从以磅为单位给出的字体大小开始,定义为 1/72 英寸;这些是“现实世界”的规模。您正在绘制的图像以像素为单位定义。仅当您还定义了每英寸像素比率时,像素才会与英寸/点数相关。

    所以你思考问题的方式有点倒退:你需要从你拥有的像素(来自源图像或目标图像)开始,然后计算适当的字体大小。如果您想让用户选择字体大小,您需要定义(或要求)一个目标 DPI 值,以便在所涉及的比例单位之间进行更改。

    【讨论】:

    • 但是,我的问题仍然存在。我不知道文本的长度是多少。所以我不能从固定的图像大小开始。
    【解决方案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')
    

    【讨论】:

    • 嗨!感谢您的解决方案。我尝试使用您的代码,但遇到了一个小问题。没有文字出现。调整大小后我不得不再次绘制 = ImageDraw.Draw(img) 然后它起作用了。也许版本差异造成了这个问题。
    【解决方案3】:

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

    基本上,您不能在设置字体大小时设置固定宽度和高度。两者都是相互依赖的。所以如果增加一个,第二个也会增加。

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

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

    【讨论】:

    • 我觉得特别有趣的是,我在您提出索赔前五天回答了您的问题:“很遗憾,没有人能够回答我的问题。”
    【解决方案4】:

    如果你可以使用openCV和numpy,你可以

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

    3. 使用 putText 向图像添加文本,

    4. 使用 imwrite 保存图像。

    请参阅 herehere 以获取参考资料。

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 2016-10-07
      • 2011-10-31
      • 2011-06-21
      • 2015-03-14
      • 1970-01-01
      • 2012-11-08
      相关资源
      最近更新 更多