web-dev-qa-db-fra.com

PIL comment mettre à l'échelle la taille du texte par rapport à la taille de l'image

J'essaie de mettre à l'échelle dynamiquement du texte à placer sur des images de dimensions variables mais connues. Le texte sera appliqué en filigrane. Existe-t-il un moyen de mettre le texte à l'échelle par rapport aux dimensions de l'image? Je n'exige pas que le texte occupe toute la surface, juste pour être suffisamment visible pour être facilement identifiable et difficile à supprimer. J'utilise Python Imaging Library version 1.1.7. Sous Linux.

J'aimerais pouvoir définir le rapport entre la taille du texte et les dimensions de l'image, disons comme 1/10 de la taille ou quelque chose.

J'ai regardé l'attribut de taille de police pour changer la taille mais je n'ai pas eu de chance de créer un algorithme pour le mettre à l'échelle. Je me demande s'il y a une meilleure façon.

Des idées sur la façon dont je pourrais y parvenir?

Merci

31
Shpongle

Vous pouvez simplement augmenter la taille de la police jusqu'à ce que vous trouviez un ajustement. font.getsize() est la fonction qui vous indique la taille du texte rendu.

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

Si ce n'est pas assez efficace pour vous, vous pouvez implémenter un schéma de recherche de racine, mais je suppose que la fonction font.getsize() est de petites pommes de terre par rapport au reste de vos processus d'édition d'image.

56
Paul

En général, lorsque vous changez la taille de la police, cela ne va pas être un changement linéaire de la taille de la police.

Non-linear Scaling

Maintenant, cela dépend souvent du logiciel, des polices, etc ... Cet exemple est tiré de Typophile et utilise la police LaTex + Computer Modern. Comme vous pouvez le voir, ce n'est pas exactement une mise à l'échelle linéaire. Donc, si vous rencontrez des problèmes avec la mise à l'échelle des polices non linéaire, je ne sais pas comment le résoudre, mais une suggestion est peut-être de le faire.

  1. Rendez la police aussi proche de la taille que vous souhaitez, puis augmentez/diminuez cette valeur via un algorithme de mise à l'échelle d'image normal ...
  2. Acceptez simplement qu'il ne s'agira pas exactement d'une mise à l'échelle linéaire et essayez de créer une sorte de tableau/algorithme qui sélectionnera la taille en points la plus proche pour que la police corresponde à la taille de l'image.
7
Pharaun