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

18

Я пытаюсь динамически масштабировать текст для размещения на изображениях различных, но известных размеров. Текст будет применяться как водяной знак. Есть ли способ масштабировать текст по отношению к размерам изображения? Я не требую, чтобы текст занимал всю площадь поверхности, чтобы быть достаточно заметным, чтобы его легко идентифицировать и трудно удалить. Я использую Python Imaging Library версии 1.1.7. на Linux.

Я хотел бы иметь возможность установить отношение размера текста к размеру изображения, например, 1/10 размера или что-то еще.

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

Любые идеи о том, как я мог бы достичь этого?

Спасибо

    
задан Shpongle 04.02.2011 в 20:41
источник

2 ответа

39

Вы можете просто увеличить размер шрифта, пока не найдете нужное. font.getsize() - это функция, которая сообщает вам, насколько велик отображаемый текст.

import ImageFont, ImageDraw, Image

image = Image.open('hsvwheel.png')
draw = ImageDraw.Draw(image)
txt = "Hello World"
fontsize = 1  # starting font size

# portion of image width you want text width to be
img_fraction = 0.50

font = ImageFont.truetype("arial.ttf", fontsize)
while font.getsize(txt)[0] < img_fraction*image.size[0]:
    # iterate until the text size is just larger than the criteria
    fontsize += 1
    font = ImageFont.truetype("arial.ttf", fontsize)

# optionally de-increment to be sure it is less than criteria
fontsize -= 1
font = ImageFont.truetype("arial.ttf", fontsize)

print 'final font size',fontsize
draw.text((10, 25), txt, font=font) # put the text on the image
image.save('hsvwheel_txt.png') # save it

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

ответ дан Paul 04.02.2011 в 21:43
  • Привет, Пол, это сделал трюк. Спасибо за помощь –  Shpongle 05.02.2011 в 15:08
5

В общем, при изменении размера шрифта его не будет линейным изменением размера шрифта.

Теперь это часто зависит от программного обеспечения, шрифтов и т. д. Этот пример был взят из Typophile и использует LaTex + Современный шрифт компьютера. Как вы можете видеть, это не совсем линейное масштабирование. Поэтому, если у вас возникли проблемы с нелинейным масштабированием шрифта, я не уверен, как его решить, но одно предложение может быть.

  1. Отметьте шрифт как можно ближе к размеру, который вы хотите, затем масштабируйте его вверх / вниз с помощью обычного алгоритма масштабирования изображения ...
  2. Просто согласитесь, что это будет не точно линейное масштабирование и попытайтесь создать какую-то таблицу / алгоритм, который выберет ближайший размер точки для шрифта, который соответствует размеру изображения.
ответ дан Pharaun 04.02.2011 в 21:33
  • Спасибо за ответ. Метод, предложенный Павлом, решил это. В любом случае, спасибо. –  Shpongle 05.02.2011 в 15:14
  • Моя первая мысль, глядя на изображение, была «хорошо, если вы не масштабируете высоту строки с текстом, тогда, конечно, это не будет выглядеть линейным». Но, сравнивая длину строк, вы можете видеть, что протяженная длина шрифта 6pt составляет более половины из 12pt, а 5pt - более половины длины 10pt. –  Ian 29.04.2016 в 13:48