16 votes

PIL comment mettre à l'échelle l'image par rapport au texte dessiné sur l'image

J'essaie d'augmenter dynamiquement la taille de l'image en fonction de la police et du texte fournis à l'utilisateur. draw.text() .

Le problème originel est de créer une image de signature basée sur le nom et la police choisie par l'utilisateur.

Voici mon code

from PIL import (Image, ImageDraw, ImageFont,)

width=20
height=20
selected_font='simply_glomrous.ttf'
font_size=30

img = Image.new('RGBA', (width, height), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), "Adil Malik", (0,0,0), font)
img.save('signature.png')

Mais j'ai toujours la même taille d'image définie en largeur et en hauteur. Peut-on redimensionner dynamiquement l'image en fonction de la police et de sa taille ?

Note : Cette question est opposée à cette question de stackoverflow

13voto

Darwesh Points 417

Malheureusement, personne n'a pu répondre à ma question.

En fait, vous ne pouvez pas définir la largeur et la hauteur du fichier tout en définissant la taille de la police. Les deux sont dépendants l'un de l'autre. Ainsi, si l'une augmente, la seconde augmente également.

J'ai donc trouvé une autre solution. Je définis simplement la taille de la police et, en fonction de cette taille, je définis la largeur et la hauteur.

from PIL import (Image, ImageDraw, ImageFont,)

name = 'Adil Malik'
selected_font='simply_glomrous.ttf'
font_size=30

font = ImageFont.truetype(selected_font, font_size)
font_size = font.getsize(name)

img = Image.new('RGBA', (font_size[0], font_size[0]), (255, 255, 255, 0))
draw = ImageDraw.Draw(img)
font = ImageFont.truetype(selected_font, font_size)
draw.text((0,0), name, (0,0,0), font)
img.save('signature.png')

3voto

Yohai De Points 88

Si vous pouvez utiliser openCV et numpy, vous pouvez

  1. Vérifier la taille du texte en utilisant getTextSize

  2. Créer une image blanche en utilisant numpy.ones((height, width, 3), np.uint8)*255

  3. Ajoutez du texte à l'image à l'aide de putText,

  4. Enregistrez l'image en utilisant imwrite.

Véase ici y ici pour les références.

2voto

user2722968 Points 2421

Tout d'abord, il faut que vos échelles soient correctes : Vous partez d'une taille de police donnée en points, ce qui correspond à 1/72 de pouce ; ce sont les échelles du "monde réel". L'image sur laquelle vous dessinez est définie en pixels. Les pixels ne sont reliés aux pouces/points que si vous définissez également le rapport pixels/pouces.

La façon dont vous envisagez le problème est donc quelque peu rétrograde : Vous devez commencer par les pixels dont vous disposez (soit de l'image source, soit de l'image cible), puis calculer la taille de police appropriée. Si vous voulez que l'utilisateur choisisse une taille de police, vous devez définir (ou demander) une valeur DPI cible afin de passer d'une unité d'échelle à l'autre.

2voto

Jonny Morrill Points 187

La fonctionnalité que vous recherchez est la Draw.textsize qui prend en entrée une chaîne de texte et des options de dessin et renvoie la largeur et la hauteur du texte rendu.

http://effbot.org/imagingbook/imagedraw.htm#tag-ImageDraw.Draw.textsize

Vous pouvez utiliser le Draw avec une image dont la largeur et la hauteur sont égales à zéro, puis appelez la méthode pour déterminer les dimensions du texte que vous souhaitez rendre. Une fois que vous connaissez ces dimensions, vous pouvez redimensionner l'image en conséquence. En voici un exemple :

from PIL import ImageDraw, ImageFont, Image

# parameters
text = "My Name"
selected_font = "simply_glomrous.ttf"
font_size = 30

# get the size of the text
img = Image.new('RGBA', (0,0), (255, 255, 255, 0))
font = ImageFont.truetype(selected_font, font_size)
draw = ImageDraw.Draw(img)
text_size = draw.textsize(text, font)

# resize and draw
img = img.resize(text_size)
draw.text((0,0), text, (0,0,0), font)
img.save('signature.png')

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X