Как бы я выравнивал по центру (и средний-вертикальный-выравнивать) текст при использовании PIL?
Текст центра/среднего выравнивания с PIL?
Ответ 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')
Ответ 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), чтобы выяснить размеры вашего текстового объекта, прежде чем нарисовать его. Затем нарисуйте его, начиная с соответствующих координат.