PIL как масштабировать изображение по отношению к тексту, нарисованному на изображении

Я пытаюсь динамически увеличить размер изображения относительно шрифта и текста, заданного draw.text().

Оригнальная проблема заключается в создании изображения подписи на основе имени и выбора шрифта.

Вот мой код

from PIL import (Image, ImageDraw, ImageFont,)

width=20
height=20
selected_font='simply_glomrous.ttf'
font_size=30

img = Image.new('RGBA', (width, height), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), "Adil Malik", (0,0,0), font)
img.save('signature.png')

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

Примечание: этот вопрос противоположный этому вопросу о стеке_потока

Ответы

Ответ 1

К сожалению, никто не может ответить на мой вопрос.

В принципе, вы не можете установить ширину и высоту установки при настройке размера шрифта. Оба они зависят друг от друга. Так что, если один увеличивается, второй также увеличивается.

Итак, я придумал другое решение. Я просто устанавливаю размер шрифта, а затем на основе этого размера шрифта, я устанавливаю ширину и высоту.

from PIL import (Image, ImageDraw, ImageFont,)

name = 'Adil Malik'
selected_font='simply_glomrous.ttf'
font_size=30

font = ImageFont.truetype(selected_font, font_size)
font_size = font.getsize(name)

img = Image.new('RGBA', (font_size[0], font_size[0]), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), name, (0,0,0), font)
img.save('signature.png')

Ответ 2

Если вы можете использовать openCV и numpy, вы можете

  • Проверьте размер текста, используя getTextSize
  • Создайте белое изображение с помощью numpy.ones((высота, ширина, 3), np.uint8) * 255

  • Добавить текст в изображение с помощью putText,

  • Сохраните изображение, используя imwrite.

Смотрите здесь и здесь для ссылок.

Ответ 3

Функцией, которую вы ищете, является метод Draw.textsize, который принимает текстовую строку и параметры чертежа в качестве входных данных и возвращает ширину и высоту отображаемого текста.

http://effbot.org/imagingbook/imagedraw.htm#tag-ImageDraw.Draw.textsize

Вы можете использовать класс Draw с изображением с шириной и высотой ноль, а затем вызвать метод для определения размеров текста, который вы хотите визуализировать. Как только вы узнаете эти размеры, вы можете изменить размер изображения соответствующим образом. Например:

from PIL import ImageDraw, ImageFont, Image

# parameters
text = "My Name"
selected_font = "simply_glomrous.ttf"
font_size = 30

# get the size of the text
img = Image.new('RGBA', (0,0), (255, 255, 255, 0))
font = ImageFont.truetype(selected_font, font_size)
draw = ImageDraw.Draw(img)
text_size = draw.textsize(text, font)

# resize and draw
img = img.resize(text_size)
draw.text((0,0), text, (0,0,0), font)
img.save('signature.png')

Ответ 4

Во-первых, вам нужно правильно оценить свои масштабы: вы начинаете с размера шрифта, указанного в точках, который определяется как 1/72 дюйма; это "реальный мир". Изображение, которое вы рисуете, определяется в пикселях. Пиксели соотносятся с дюймами/точками, только если вы также определяете соотношение пикселей на дюйм.

Таким образом, как вы думаете о проблеме, это отброс назад: вам нужно начать с пикселей, которые у вас есть (либо из исходного, либо целевого изображения), а затем вычислить соответствующий размер шрифта. Если вы хотите, чтобы пользователь выбирал размер шрифта, вам нужно определить (или запросить) целевое значение DPI, чтобы изменить между участвующими единицами масштаба.