17

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

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

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

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

Благодаря

ответ

37

Вы можете просто увеличить размер шрифта до тех пор, пока не найдете подходящий вариант. 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 

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

+4

Привет, Пол, это сделал трюк. Спасибо за помощь – Shpongle

5

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

Non-linear Scaling

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

  1. Рендер шрифт, как близко к размеру, который вы хотите, то масштаб, что вверх/вниз с помощью регулярного алгоритма масштабирования изображения ...
  2. Просто примите, что это не будет именно линейное масштабирование и попытаться создать какая-то таблица/алгоритм, который выберет ближайший размер точки для того, чтобы шрифт соответствовал размеру изображения.
+0

Спасибо за ответ. Метод, предложенный Павлом, решил это. В любом случае, спасибо. – Shpongle

+0

Моя первая мысль, глядя на изображение, была «хорошо, если вы не масштабируете высоту строки с текстом, а затем _course_, это не будет выглядеть линейным». Но, сравнивая длину строк, вы можете видеть, что протяженная длина шрифта 6pt составляет более половины из 12pt, а 5pt - более половины длины 10pt. – Ian

Смежные вопросы