Python PIL:Can';尽管考虑了字体,但仍不能准确地垂直对齐文本

Python PIL:Can';尽管考虑了字体,但仍不能准确地垂直对齐文本,python,python-imaging-library,Python,Python Imaging Library,我想创建一个简单的Python脚本,让我创建一个图像文件并在画布上放置一个单词dead center。然而,虽然我可以让单词水平对齐,但我就是不能让它垂直居中。顺便说一句,我在MacOS上。到目前为止,我已经尝试过: import os from PIL import Image, ImageDraw, ImageFont font_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts') font = Im

我想创建一个简单的Python脚本,让我创建一个图像文件并在画布上放置一个单词dead center。然而,虽然我可以让单词水平对齐,但我就是不能让它垂直居中。顺便说一句,我在MacOS上。到目前为止,我已经尝试过:

import os
from PIL import Image, ImageDraw, ImageFont
font_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts')
font = ImageFont.truetype(os.path.join(font_path, "Verdana.ttf"), 80)
W, H = (1200,200)
msg = "hola"
im = Image.new("RGB",(W,H),(255,255,255))
draw = ImageDraw.Draw(im)
w, h = draw.textsize(msg, font)
draw.text(((W-w)/2,(H-h)/2), msg, font=font, fill="black")
im.save("output_script.png", "PNG")

我已经考虑过文本大小计算中的字体。但这个词仍然出现在中间偏下约5-10%的位置。有什么想法吗?

textsize
似乎返回实际文本的大小,而不是行的大小。所以
ooo
XXX

我认为您应该使用80(您给出的PIL大小)作为高度,尽管我不能保证它是正确的。

ImageFont.getmask(txt)
返回alpha掩码位图,文本可以在图像中居中

import Image, ImageFont

img = Image.new('L', (32, 32), color=0)
img_w, img_h = img.size

font = ImageFont.truetype('/path/to/font.ttf', 16)
mask = font.getmask('hola') # your text here
mask_w, mask_h = mask.size

d = Image.core.draw(img.im, 0)
d.draw_bitmap(((img_w - mask_w)/2, (img_h - mask_h)/2), mask, 255) # last arg is pixel intensity of text

img.save('test.png')

干杯在考虑了你的建议后,我使用fontsize/2表示高度,这对我来说很有效,不确定它是否100%居中,但看起来非常接近。谢谢