我有一个大约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字符长的文本完美的方式。也许我应该计算所有像素?
答案 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()
和生成器表达式),我们使用它来计算初始偏移量。