Подтвердить что ты не робот

Текст центра/среднего выравнивания с PIL?

Как бы я выравнивал по центру (и средний-вертикальный-выравнивать) текст при использовании PIL?

4b9b3361

Ответ 1

Используйте Draw.textsize method для расчета размера текста и перерасчета позиции соответственно.

Вот пример:

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")

и результат:

изображение с центрированным текстом

Ответ 2

Вот пример кода, который использует textwrap для разделения длинной строки на куски, а затем использует метод textsize для вычисления позиций.

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

Ответ 3

Следует отметить, что метод Draw.textsize является неточным. Я работал с изображениями с низкими пикселями, и после некоторого тестирования выяснилось, что textize считает, что каждый символ имеет ширину 6 пикселей, тогда как "I" принимает максимум. 2 пикселя, а "W" занимает мин. 8 пикселей (в моем случае). И так, в зависимости от моего текста, это было или не было сосредоточено вообще. Хотя, я думаю, "6" было в среднем, поэтому, если вы работаете с длинными текстами и большими изображениями, все равно должно быть хорошо.

Но теперь, если вам нужна какая-то реальная точность, лучше использовать метод getize объекта шрифта, который вы собираетесь использовать:

arial = ImageFont.truetype("arial.ttf", 9)
w,h = arial.getsize(msg)
draw.text(((W-w)/2,(H-h)/2), msg, font=arial, fill="black")

Как используется в ссылке Edilio.

Ответ 4

Вы можете найти реализацию этого в http://tools.jedutils.com/tools/center-text-image

Вы можете использовать эту страницу для создания изображения прямо там, а не для реализации самой процедуры, но используемый код также включен на странице.

Ответ 5

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