Текст Center-/middle-align с PIL?

Как я центрировался бы - выравнивают (и middle-vertical-align) текст при использовании PIL?

51
задан Phillip B Oldham 28 December 2009 в 08:21
поделиться

3 ответа

Используйте метод 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")

и результат:

image with centered text

Если ваш шрифт отличается, включите такой шрифт:

myFont = ImageFont.truetype("my-font.ttf", 16)
draw.textsize(msg, font=myFont)
106
ответ дан 7 November 2019 в 09:42
поделиться

Используйте метод textize (см. docs), чтобы вычислить размеры вашего текстового объекта до его фактического черчения. Затем нарисуйте его, начиная с соответствующих координат.

.
2
ответ дан 7 November 2019 в 09:42
поделиться

Вот пример кода, который использует текстовую обертку для разбиения длинной строки на кусочки, а затем использует метод 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')

enter image description here

59
ответ дан 7 November 2019 в 09:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: