【问题标题】:How to calculate length of string in pixels for specific font and size?如何计算特定字体和大小的字符串长度(以像素为单位)?
【发布时间】:2016-06-16 18:15:09
【问题描述】:

如果字体,例如“Times New Roman”和大小,例如12 pt,已知,字符串的长度如何,例如“Hello world” 以像素为单位计算,也许只是近似?

我需要它对 Windows 应用程序中显示的文本进行一些手动右对齐,因此我需要调整数字空格来获得对齐。

【问题讨论】:

标签: python windows python-3.x fonts


【解决方案1】:

根据@Selcuk 的评论,我找到了答案:

from PIL import ImageFont
font = ImageFont.truetype('times.ttf', 12)
size = font.getsize('Hello world')
print(size)

将 (x, y) 大小打印为:

(58, 11)

这是一个函数:

from PIL import ImageFont

def get_pil_text_size(text, font_size, font_name):
    font = ImageFont.truetype(font_name, font_size)
    size = font.getsize(text)
    return size

get_pil_text_size('Hello world', 12, 'times.ttf')

【讨论】:

  • 根据该网站,Python 3 尚不支持 PIL 模块 pythonware.com/products/pil。所以我无法让上述工作。
  • 这适用于我在 Python3 上安装 Pillow(PIL 的现代更新版本)。 pillow.readthedocs.io 有安装说明(“pip install Pillow”)。
  • 安装 Pillow 模块后也可以在 Visual Studio 2019 中使用,谢谢大家!
  • 在 Python 3.7.3 中工作
【解决方案2】:

另一种方法是按如下方式询问 Windows:

import ctypes

def GetTextDimensions(text, points, font):
    class SIZE(ctypes.Structure):
        _fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)]

    hdc = ctypes.windll.user32.GetDC(0)
    hfont = ctypes.windll.gdi32.CreateFontA(points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font)
    hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont)

    size = SIZE(0, 0)
    ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text, len(text), ctypes.byref(size))

    ctypes.windll.gdi32.SelectObject(hdc, hfont_old)
    ctypes.windll.gdi32.DeleteObject(hfont)

    return (size.cx, size.cy)

print(GetTextDimensions("Hello world", 12, "Times New Roman"))
print(GetTextDimensions("Hello world", 12, "Arial"))

这将显示:

(47, 12)
(45, 12)

【讨论】:

  • 谢谢;必须添加 () 才能在 Python 3 上使用 print ,否则它可以工作。但奇怪的是,这两种方法之间存在显着的 x 大小差异。
  • 您可以从给定字体中获取很多尺寸,所以我猜getsize() 使用的是不同的尺寸。
  • 我收到 AttributeError:模块 'ctypes' 没有属性 'windll'。这很奇怪,因为当我在 ctypes python 之后点击“w”时,会在弹出框中显示该方法。
  • 您使用的是哪个版本的 Python?它在 2.7.12 中运行良好。请注意,它仅适用于 Windows。
猜你喜欢
  • 1970-01-01
  • 2014-07-16
  • 2011-09-15
  • 1970-01-01
  • 2015-03-05
  • 2013-08-22
  • 2010-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多