PIL, как масштабировать размер текста по отношению к размеру изображения - PullRequest
25 голосов
/ 04 февраля 2011

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

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

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

Есть идеи, как мне этого добиться?

Спасибо

Ответы [ 2 ]

55 голосов
/ 04 февраля 2011

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

7 голосов
/ 04 февраля 2011

Как правило, при изменении размера шрифта изменение размера шрифта не будет линейным.

Non-linear Scaling

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

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