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, чтобы изменить между участвующими единицами масштаба.