计算python上字符串的宽度/高度

时间:2018-02-14 18:13:50

标签: python-3.x matplotlib fonts

我试图计算各种字符串的高度/宽度(给定字体和大小)。我试图关注this example。我写了以下内容:

from matplotlib import rcParams
import os.path
afm_fname = os.path.join(rcParams['datapath'], 'fonts', 'afm', 'ptmr8a.afm')

from matplotlib.afm import AFM
with open(afm_fname) as fh:
    afm = AFM(fh)

但是我收到以下错误:

Traceback (most recent call last):
  File "<pyshell#15>", line 2, in <module>
    afm = AFM(fh)
  File "C:\Python\lib\site-packages\matplotlib\afm.py", line 337, in __init__
    parse_afm(fh)
  File "C:\Python\lib\site-packages\matplotlib\afm.py", line 323, in parse_afm
    _sanity_check(fh)
  File "C:\Python\lib\site-packages\matplotlib\afm.py", line 102, in _sanity_check
    if not line.startswith(b'StartFontMetrics'):
TypeError: startswith first arg must be str or a tuple of str, not bytes

非常感谢任何帮助。注意,我不需要使用matplotlib,所以如果有更好的方法在python中获取这些数字,我会对其他选项开放(如果重要的话,文本最终会在SVG中使用)。

我也尝试过使用freetype-py,但是在进口freetype&#39;之后遇到了麻烦。 - 我认为由于Windows上的freetype问题,它似乎无法找到合适的dll。 github repo上有各种各样的问题,但是我们无法找到问题的解决方案。无论什么解决方案:非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

这确实是一个python 2到3问题(https://docs.python.org/3/howto/pyporting.html#text-versus-binary-data),其代码中带有AFM硬编码二进制字符串。一种解决方案是明确地以二进制模式打开afm_fname,如果可以的话。

from matplotlib import rcParams
import os.path
afm_fname = os.path.join(rcParams['datapath'],
                        'fonts', 'afm', 'ptmr8a.afm')

from matplotlib.afm import AFM
with open(afm_fname, 'rb') as fh:
    afm = AFM(fh)
afm.string_width_height('What the heck?')

# (6220.0, 694)

字符串方法startswith适用于python 2中的文本和二进制数据。因此上面的代码也适用于python 2。 Python 3区分文本和二进制数据。所以'rb'是必要的。 matplotlib中的示例可能需要更新或备注。