Подушка, как разместить текст в центре изображения - PullRequest
5 голосов
/ 20 апреля 2019

Я использую Подушку (PIL) 6.0 и добавляю текст в изображение.И я хочу поместить текст в центр изображения.Вот мой код,

import os
import string
from PIL import Image
from PIL import ImageFont, ImageDraw, ImageOps

width, height = 100, 100

text = 'H'
font_size = 100

os.makedirs('./{}'.format(text), exist_ok=True)

img = Image.new("L", (width, height), color=0)   # "L": (8-bit pixels, black and white)
font = ImageFont.truetype("arial.ttf", font_size)
draw = ImageDraw.Draw(img)
w, h = draw.textsize(text, font=font)
draw.text(((width-w)/2, (height-h)/2), text=text, fill='white', font=font)

img.save('H.png')

Вот вывод:

enter image description here

Вопрос:

Текстнаходится в центре по горизонтали, но не в центре по вертикали.Как я могу поместить его в центр по горизонтали и вертикали?

1 Ответ

2 голосов
/ 20 апреля 2019

В тексте всегда есть дополнительное пространство вокруг символов, например, если мы создадим прямоугольник с точным размером, указанным для вашего 'H'

img = Image.new("L", (width, height), color=0)   # "L": (8-bit pixels, black and white)
font = ImageFont.truetype("arial.ttf", font_size)
draw = ImageDraw.Draw(img)
w, h = draw.textsize(text, font=font)
# draw.text(((width-w)/2, (height-h)/2), text=text, fill='white', font=font)
# img.save('H.png')
img2 = Image.new("L", (w, h), color=0)   # "L": (8-bit pixels, black and white)
draw2 = ImageDraw.Draw(img2)
draw2.text((0, 0)), text=text, fill='white', font=font)
img2.save('H.png')

дает ограничивающий прямоугольник:

enter image description here

Зная, что высота строки обычно на ~ 20% больше, чем глифы / символы (+ некоторые пробные и ошибочные), и мы можем выяснить размер дополнительного пробела.(Дополнительное пространство для ширины распределяется поровну, поэтому не интересно для центрирования).

draw2.text((0, 0 - int(h*0.21)), text=text, fill='white', font=font)

, который перемещает букву H вверх:

enter image description here

Включив это обратно в ваш исходный код:

img = Image.new("L", (width, height), color=0)   # "L": (8-bit pixels, black and white)
font = ImageFont.truetype("arial.ttf", font_size)
draw = ImageDraw.Draw(img)
w, h = draw.textsize(text, font=font)
h += int(h*0.21)
draw.text(((width-w)/2, (height-h)/2), text=text, fill='white', font=font)
img.save('H.png')

дает:

enter image description here

0.21Коэффициент обычно хорошо работает для большого диапазона размеров шрифта для того же шрифта.Например, просто подключив шрифт 30:

enter image description here

...