使用PIL水平和垂直对齐文本

时间:2013-12-31 14:20:19

标签: python python-imaging-library

我有一个大约100个字符长的字符串(一个句子)并且使用此示例代码(它使用textwrap)我可以将字符串拆分成片段,然后使用textsize方法计算位置:

import Image
import ImageDraw
import ImageFont
import textwrap

sentence='This is a text. Some more text 123. Align me please.'
para=textwrap.wrap(sentence,width=15)

MAX_W,MAX_H=500,800
im = Image.new('RGB', (MAX_W, MAX_H), (0, 0, 0, 0))
draw = ImageDraw.Draw(im)
font = ImageFont.truetype('/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 36)

current_h=0
for line in para:
    w,h=draw.textsize(line, font=font)
    draw.text(((MAX_W-w)/2, current_h), line, font=font)
    current_h+=h

im.save('test.png')

此代码水平对齐文本,但我需要将文本垂直对齐。我怎样才能做到这一点?我的图像的尺寸是800x500,我只想要一个100字符长的文本完美的方式。也许我应该计算所有像素?

1 个答案:

答案 0 :(得分:2)

您需要考虑到文本的高度将用于每行文本;计算所有行的垂直大小,并根据该位置确定您的位置:

# Half of the remainder of the image height when space for all lines has been reserved:
line_dimensions = [draw.textsize(line, font=font) for line in para]
offset = (MAX_H - sum(h for w, h in line_dimensions)) // 2

current_h = offset
for line, (w, h) in zip(para, line_dimensions):
    draw.text(((MAX_W - w) // 2, current_h), line, font=font)
    current_h += h

此处line_dimensions是段落中每行的(width, height)元组列表。然后从中获取总高度(使用sum()和生成器表达式),我们使用它来计算初始偏移量。