Has*_*aig 9 python text-processing python-imaging-library 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 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
Run Code Online (Sandbox Code Playgroud)
METHOD 1产生宽度3236,而METHOD 2产量3270.为什么会出现差异?此外,我还注意到样本文本越短,这两种方法之间的差异就越小.
引擎盖下发生了什么?哪个宽度可以被认为是渲染句子的真实宽度?最后,我是否可以做两个方法报告大致相同宽度的调整?
注意:示例文本长度为445个字符
Hug*_*ugo 19
你在这里做两件事:
如果您使用的是等宽字体,事情可能会有所不同,但字体通常使用称为字距调整的东西来使文本更平滑,更紧凑.
维基百科说:
在排版中,字距调整是以比例字体调整字符之间的间距的过程,通常是为了获得视觉上令人愉悦的结果.字距调整单个字母表单之间的间距,而跟踪(字母间距)在一系列字符上均匀调整间距.在良好字体中,每对字符之间的二维空白区域都具有视觉上相似的区域.
这是DejaVuSans字体的一些字距:
在引擎盖下,Pillow对你的两种方法没有太大的不同.只是你以不同的方式打电话给他们.
如果你使用与方法二相同的函数添加第三种方法来获得整个句子的宽度,你也可以得到与获得整个句子相同的宽度,如方法一:
# METHOD 3
width = font.getsize(sample)[0]
print width
Run Code Online (Sandbox Code Playgroud)
这是枕头ImageDraw.textsize(来自方法一和三):
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)
Run Code Online (Sandbox Code Playgroud)
对于单行文本,这只是返回font.getsize,与方法二相同.(对于多行文本,它只是将其拆分为行并返回多个font.getsize调用的总和.)
| 归档时间: |
|
| 查看次数: |
6248 次 |
| 最近记录: |