问题描述
我已经遇到了几个问题,对此还没有令人满意的答案。枕头可以使用ttf字体,但是draw.textsize(text,font)和font.getsize(text)返回相同的错误尺寸。
opencv.getTextSize是正确的,但仅提供了几种字体。
在第2步将该图像转换为opencv像素数组并在第3步精确裁剪后,我在带有枕头的文本上绘制了一个尺寸大于其所需大小的图像,从而获得了精确的结果。
这有两个问题:
- 太慢了。那么,是否有一种快速的方法来提取一个数组的中心部分,该部分切掉所有白色像素或所有阈值以下的边界?
- 即使知道确切的尺寸,也要在较大的框中以精确的文本大小在原点处绘制文本,即以方形为中心的数字,但仍不会居中绘制。我假设枕头计算字距或此类字体相关尺寸的空白像素到文本大小或getsize返回区域中。因此,最终这也可能与特定的不良字体有关,但是对于Arial,Arialbd,Times New Roman或Cambria来说,我得到的错误结果也一样。
有没有机会获得这种精确的结果?最后,我想生成一个框,该框限制内部数字的范围(用于与数学相关的学习/演示视频)。不仅要花时间,还要摆弄手动更正会让制作这样的视频成为噩梦,我现在建立的基本工具应该尽可能精确。
编辑:在我的情况下,文本是数字,并且它们都没有升序和降序。我还观察到水平居中工作正常,只是垂直位置太低。考虑偏移量后,我会看到什么。
解决方法
如该图片several different metrics所示,字体具有from the Pillow appendix on Text Anchors:
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。