Как я центрировался бы - выравнивают (и middle-vertical-align) текст при использовании PIL?
Используйте метод Draw.textize
для вычисления размера текста и пересчета позиции соответственно.
Вот пример:
from PIL import Image, ImageDraw
W, H = (300,200)
msg = "hello"
im = Image.new("RGBA",(W,H),"yellow")
draw = ImageDraw.Draw(im)
w, h = draw.textsize(msg)
draw.text(((W-w)/2,(H-h)/2), msg, fill="black")
im.save("hello.png", "PNG")
и результат:
Если ваш шрифт отличается, включите такой шрифт:
myFont = ImageFont.truetype("my-font.ttf", 16)
draw.textsize(msg, font=myFont)
Используйте метод textize
(см. docs), чтобы вычислить размеры вашего текстового объекта до его фактического черчения. Затем нарисуйте его, начиная с соответствующих координат.
Вот пример кода, который использует текстовую обертку для разбиения длинной строки на кусочки, а затем использует метод textize
для вычисления позиций.
from PIL import Image, ImageDraw, ImageFont
import textwrap
astr = '''The rain in Spain falls mainly on the plains.'''
para = textwrap.wrap(astr, width=15)
MAX_W, MAX_H = 200, 200
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', 18)
current_h, pad = 50, 10
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 + pad
im.save('test.png')