【问题标题】:PIL ImageDraw.Text or ImageDraw.multiline_text AlignmentPIL ImageDraw.Text 或 ImageDraw.multiline_text 对齐
【发布时间】:2021-01-16 18:34:02
【问题描述】:

我想在一张图片中画出价格,其中 fontsize=2x 代表美元,fontsize=x 代表美分,如下所示:


我希望能够写出 1.90 和 19.90 等等,这就是为什么我希望美元金额右对齐,而美分金额标准左对齐。

编辑:我忘记了一个要点:逗号是固定的(因为显示位置),我想写美元值以便它向左扩展,而美分值始终保持原样(00, 05 , 10, 19, 99....)。因此,当我写而不是 12,99 时,例如 123,99 我仍然希望 , 处于相同的位置。到目前为止,我唯一的想法是使用单个字符,这些字符处理起来不太舒服:(

【问题讨论】:

  • 您能告诉我们您尝试过什么以及它是如何失败的吗?在我看来,通过更改字体并使用ImageDraw module 中的textsize 函数,可以直接实现您想要的,但我自己没有尝试过。

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


【解决方案1】:

使用 ImageDraw 模块,您可以获得文本字符串的大小。

draw.textsize(string, options) ⇒ (width, height)

这是来自http://effbot.org/imagingbook/imagedraw.htm 的文档。因此,您可以获得字符串“12”的宽度(以像素为单位)。现在您只需从所需的结束位置减去宽度即可知道从哪里开始。不幸的是,除了指定左上角之外,PIL 似乎没有提供定位文本的方法,因此对于其他锚点,您必须自己计算(据我所知)。

编辑: 我刚刚查看了http://pillow.readthedocs.org/reference/ImageDraw.html#functions的 Pillow 文档

给定函数的签名是

PIL.ImageDraw.Draw.text(xy, text, fill=None, font=None, anchor=None)

但是,在签名下方的 cmets 中,没有解释“anchor”,因此它可能只是计划中的未来增强。我自己对 Pillow 文档的经验表明这是一个真正的可能性。就个人而言,我会尝试查看 Pillow 源并确定在从 PIL 转换为 Pillow 之前的状态。

【讨论】:

  • 谢谢!是的,这正是我现在所做的。但我想知道是否有更简单的方法来做到这一点。
  • @xtlc 我在原始答案中添加了一些 cmets。
  • 嘿,textsize 总是返回一组错误的值。如果我用计数像素测量一个字母,我会得到类似 47x 59 的东西,但 textsize 返回 12 x 21 大小。可能是因为我使用了ImageFont.truetype('pathtofont', fontsize) 电话吗?
  • 我没用过truetype,所以不能说。这可能是相关的github.com/python-pillow/Pillow/issues/644
  • 是的,我认为这正是我的问题。他们甚至说它在 2.6 版中得到了修复,但到目前为止它仍然无法正常工作。我并不是很想自己写那个函数:(
【解决方案2】:

对于所有在 PIL 和锚点上苦苦挣扎的人 - 文档已更新。 Pillow 现在支持锚点放置。

这里是文档:https://pillow.readthedocs.io/en/stable/handbook/text-anchors.html

在您的具体示例中,您可以放置​​一个相对于基线的文本元素,而另一个相对于上升层的文本元素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 2022-11-03
    • 2021-02-21
    • 1970-01-01
    • 2023-01-26
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多