测量文本宽度(Python/PIL)

测量文本宽度(Python/PIL),python,python-imaging-library,text-processing,pillow,Python,Python Imaging Library,Text Processing,Pillow,我使用以下两种方法来计算设置字体类型和大小的示例字符串的渲染宽度: font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 14) sample = "Lorem ipsum dolor sit amet, partem periculis an duo, eum lorem paulo an, mazim feugiat lobortis sea ut. In est error eirmod v

我使用以下两种方法来计算设置字体类型和大小的示例字符串的渲染宽度:

font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", 14)
sample = "Lorem ipsum dolor sit amet, partem periculis an duo, eum lorem paulo an, mazim feugiat lobortis sea ut. In est error eirmod vituperata, prima iudicabit rationibus mel et. Paulo accumsan ad sit, et modus assueverit eum. Quod homero adversarium vel ne, mel noster dolorum te, qui ea senserit argumentum complectitur. Duo at laudem explicari deterruisset, eu quo hinc mnesarchum. Vel autem insolens atomorum at, dolorum suavitate voluptatum duo ex."
#METHOD 1
draw_txt = ImageDraw.Draw(img)
width, height = draw_txt.textsize(sample, font=font)
print width
#METHOD 2
width = 0
for c in sample:
    width += font.getsize(c)[0]
print width
方法1
产生的宽度为
3236
,而
方法2
产生的宽度为
3270
。为什么会有差异?此外,我还注意到,样本文本越短,这两种方法之间的差异就越小

引擎盖下面发生了什么?哪个宽度可以被认为是呈现句子的真实宽度?最后,我是否可以做一些调整,使两种方法报告的宽度大致相同

注意:示例文本长度为445个字符 你在这里做了两件不同的事情:

  • 查找长文本的宽度
  • 找到所有字符的宽度,然后盲目地将它们相加
如果您使用的是单空格字体,情况可能会有所不同,但字体通常会使用一种称为字距调整的方法来使文本更平滑、更紧凑

说:

在印刷术中,字距调整是按比例字体调整字符间距的过程,通常是为了获得令人愉悦的视觉效果。紧排调整单个字母表单之间的间距,而跟踪(字母间距)在一系列字符上统一调整间距。在字距良好的字体中,每对字符之间的二维空格都有一个视觉上相似的区域

以下是一些:

幕后 在引擎盖下,枕头对你的两种方法没什么不同。只是你用不同的方式给他们打电话

如果您添加第三种方法来获得整个句子的宽度,使用与方法2中相同的函数,您也将获得与方法1中获得整个句子相同的宽度:

# METHOD 3
width = font.getsize(sample)[0]
print width
以下是枕头(来自方法一和方法三):

对于单行文本,这只是返回
font.getsize
,与方法二相同。(对于多行文本,它只是将其拆分为几行,并返回几个
font.getsize
调用的总和。)

def textsize(self, text, font=None, *args, **kwargs):
    """Get the size of a given string, in pixels."""
    if self._multiline_check(text):
        return self.multiline_textsize(text, font, *args, **kwargs)

    if font is None:
        font = self.getfont()
    return font.getsize(text)