PIL comment mettre à l'échelle la taille du texte en fonction de la taille de l'image

j'essaie d'ajuster dynamiquement le texte pour qu'il soit placé sur des images de dimensions variables mais connues. Le texte sera appliqué en tant que filigrane. Y a-t-il un moyen de dimensionner le texte par rapport aux dimensions de l'image? Je n'exige pas que le texte occupe toute la surface, juste pour être assez visible pour être facilement identifiable et difficile à enlever. J'utilise Python Imaging Library version 1.1.7. sur Linux.

je voudrais pouvoir régler le rapport de la taille du texte à la dimensions de l'image, disons 1/10 de la taille ou quelque chose.

j'ai regardé l'attribut taille de police pour changer la taille mais je n'ai pas eu de chance dans la création d'un algorithme pour la mettre à l'échelle. Je me demande s'il y a un meilleur moyen.

des idées sur comment je pourrais faire?

Merci

21
demandé sur Paul 2011-02-04 22:41:36

2 réponses

Vous pouvez simplement incrémenter la taille de la police jusqu'à ce que vous trouver une solution. font.getsize() est la fonction qui vous indique la taille du texte rendu est.

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 devine que le font.getsize() la fonction est une petite pomme de terre par rapport au reste de vos processus d'édition d'image.

43
répondu Paul 2011-02-04 21:37:57

En général, lorsque vous modifiez la taille de police sa ne va pas être une variation 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 moderne LaTex + Computer. Comme vous pouvez le voir, ce n'est pas exactement une échelle linéaire. Donc si vous avez des problèmes avec la mise à l'échelle non-linéaire de police alors je ne suis pas sûr de savoir comment le résoudre, mais une suggestion peut-être est de.

  1. rendre la police aussi proche de la taille que vous voulez, puis la mettre à l'échelle de haut en bas via l'algorithme de mise à l'échelle de l'image régulière...
  2. il suffit d'accepter que ce ne sera pas exactement une mise à l'échelle linéaire et d'essayer de créer une sorte de tableau/algorithme qui sélectionnera la taille de point la plus proche pour que la police corresponde à la taille de l'image.
6
répondu Pharaun 2011-02-04 20:33:13