【问题标题】:Is there a precise way to measure text size in a specific font in Python (3.7)?是否有一种精确的方法来测量 Python(3.7)中特定字体的文本大小?
【发布时间】:2020-11-03 19:10:19
【问题描述】:

我遇到过几个问题,但对此我的回答并不令人满意。 Pillow 可以使用 ttf 字体,但 draw.textsize(text,font) 和 font.getsize(text) 返回相同的错误尺寸。

opencv.getTextSize 是正确的,但只提供了几种字体。

我通过在尺寸大于所需近似尺寸的图像上绘制带有枕头的文本,在步骤 2 中将该图像转换为 opencv 像素数组并在步骤 3 中对其进行精确裁剪,从而获得了精确的结果。

这有两个问题:

  1. 太慢了。那么有没有一种快速的方法来提取数组的中心部分,以切断所有白色像素或低于阈值的所有内容的边界?
  2. 即使知道确切的尺寸,在原点绘制文本,在一个较大的框中使用确切的文本大小计算,即在一个正方形中居中一个数字,它仍然没有居中绘制。我假设枕头将用于字距调整或此类字体相关尺寸的空像素计数到区域 textsize 或 getsize 返回。所以最终这也可能与特定的坏字体有关,但我对 Arial、Arialbd、Times New Roman 或 Cambria 得到了同样的错误结果,仅举几例。

有没有机会得到这个精确的?最后,我想制作一个非常窄的内部数字边界框(用于与数学相关的学习/演示视频)。这不仅是迂腐,而且摆弄手动更正会使生成此类视频成为一场噩梦,我现在构建的基础工具应该尽可能精确。

编辑:在我的例子中,文本是数字,它们既没有上升也没有下降。我也观察到水平居中工作正常,只是垂直位置太低。考虑到偏移量,我会看看我得到了什么。

【问题讨论】:

  • 这可能与offset values for the font有关吗?
  • 顺便说一句我的规格:Win10 python 3.7.8,模块枕头(8.0.1)和opencv-contrib-python(4.4.0)
  • @MartijnPieters:可能相关。我必须稍后检查一下,然后再提供反馈。谢谢。
  • 谢谢你,马丁,考虑到偏移量的例子对我有用。
  • 您可以使用 python 子进程调用 Imagmagick 来使用 -debug annotate 来获取字体指标。见imagemagick.org/Usage/text/#font_info

标签: python opencv fonts python-imaging-library text-size


【解决方案1】:

字体有several different metrics,如图所示from the Pillow appendix on Text Anchors

font.getsize() method 为您提供文本的大小到上升行,而不是从顶行开始。如果您的实际文本不包含升序,则可能看起来空间太大。

Pillow 8.0.0(几周前发布,2020-10-14)具有added methods that address these issues,至少对于 TypeFont 字体,您真的想使用新的 ImageDraw.textbbox()FreeTypeFont.getbbox() 方法,与锚点设置为'lt'(左上)。前者将后者的结果转置为选定的(x, y) 坐标。

FreeTypeFont.getsize() 的文档已更新,为此添加了注释:

由于历史原因,此函数从上升行而不是顶部测量文本高度,请参阅Text anchors。如果您想从顶部测量文本高度,建议使用底部值getbbox()anchor='lt'

您可能还对one of the issues that were addressed by these new API additions 感兴趣,其中添加这些方法的开发人员demonstrates that ImageDraw.getbbox() can be used to get exact bounding boxes per character in a given text

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 2020-10-24
    • 1970-01-01
    • 2020-11-26
    • 2022-01-21
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多