有没有一种精确的方法来测量Python3.7中特定字体的文本大小?

问题描述

我已经遇到了几个问题,对此还没有令人满意的答案。枕头可以使用ttf字体,但是draw.textsize(text,font)和font.getsize(text)返回相同的错误尺寸。

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

在第2步将该图像转换为opencv像素数组并在第3步精确裁剪后,我在带有枕头的文本上绘制了一个尺寸大于其所需大小的图像,从而获得了精确的结果。

这有两个问题:

  1. 太慢了。那么,是否有一种快速方法提取一个数组的中心部分,该部分切掉所有白色像素或所有阈值以下的边界?
  2. 即使知道确切的尺寸,也要在较大的框中以精确的文本大小在原点处绘制文本,即以方形为中心的数字,但仍不会居中绘制。我假设枕头计算字距或此类字体相关尺寸的空白像素到文本大小或getsize返回区域中。因此,最终这也可能与特定的不良字体有关,但是对于Arial,Arialbd,Times New Roman或Cambria来说,我得到的错误结果也一样。

有没有机会获得这种精确的结果?最后,我想生成一个框,该框限制内部数字的范围(用于与数学相关的学习/演示视频)。不仅要花时间,还要摆弄手动更正会让制作这样的视频成为噩梦,我现在建立的基本工具应该尽可能精确。

编辑:在我的情况下,文本是数字,并且它们都没有升序和降序。我还观察到水平居中工作正常,只是垂直位置太低。考虑偏移量后,我会看到什么。

解决方法

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

Font metrics for the horizontally placed text 'Quick',with vertical markers for the ascender,descender,and base lines,and horizontal markers for left,middle and right lines.

font.getsize() method给出了文本到上升行的大小,而不是顶行的大小。如果您的实际文本不包含升序符,则看起来空间太大。

枕头8.0.0(几周前发布,2020-10-14)具有added methods that address these issues,至少对于TypeFont字体而言,并且您确实想使用新的ImageDraw.textbbox()或{{3 }}方法,并将锚点设置为'lt'(左,上)。前者将后者的结果转置到所选的(x,y)坐标上。

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

由于历史原因,此函数从上一行而不是顶部开始测量文本高度,请参见FreeTypeFont.getbbox()。如果要从顶部开始测量文本高度,建议将Text anchors的底部值与anchor='lt'一起使用。

您可能还对getbbox()感兴趣,在其中添加了这些方法的开发人员one of the issues that were addressed by these new API additions