Centre/moyen-aligner le texte avec PIL?
Comment centrer (et du moyen-vertical-align) texte lors de l'utilisation de PIL?
Vous devez vous connecter pour publier un commentaire.
Comment centrer (et du moyen-vertical-align) texte lors de l'utilisation de PIL?
Vous devez vous connecter pour publier un commentaire.
Utilisation
Tirage au sort.textsize
méthode pour calculer la taille du texte et re-calcul de la position en conséquence.Voici un exemple:
et le résultat:
Si votre fontsize est différent, inclut la police comme ceci:
draw.textsize(msg, font=myFont)
, sinon il ne sera pas bien centréVoici un exemple de code qui utilise d'habillage de texte pour diviser une longue ligne en morceaux, puis utilise la
textsize
méthode pour calculer les positions.width
est de comptage de caractères lors du PIL Images mesure en pixels. J'ai utilisé une version de ce qui précède, mais ajout d'une boucle while avant la boucle qui écrit les lignes. J'ai d'abord fixé arbitrairement une haute char comte de commencer, alors l'utilisation d'habillage de texte pour briser les lignes et ensuite l'utiliser .textsize pour mesurer la largeur en pixels de la première sortie dans le d'habillage de texte de la liste des résultats. Si elle correspond, de continuer, d'autre décrémenter mon char à compter et à mesurer de nouveau jusqu'à ce que les lignes de correspondre à l'image.On doit noter que le Tirage au sort.textsize méthode est unaccurate. Je travaillais avec une faible pixels des images, et après quelques tests, il s'est avéré que textsize considère que chaque personnage à 6 pixels de large, tandis qu'un "je" prend max. 2 pixels et un "W" prend min. 8 pixels (dans mon cas). Et donc, selon mon texte, c'était ou n'était pas centré du tout. Bien que, je suppose que "6" est une moyenne, donc si vous travaillez avec de longs textes et de grandes images, il devrait être ok.
Mais maintenant, si vous voulez une réelle précision, il vaut mieux utiliser la méthode getsize de la police de l'objet que vous allez utiliser:
Utilisé dans Edilio du lien.
getsize
accepte non-latin, caractères comme des € ou des Accents.textsize
ne le font pas. ThumbsUp 🙂Vous pouviez trouver une mise en œuvre de ce à http://tools.jedutils.com/tools/center-text-image
Vous pouvez utiliser cette page pour la création de l'image de droite au lieu de la mise en œuvre de la routine vous-même, mais le code utilisé est inclus sur la page de trop.
Utiliser le
textsize
méthode (voir docs) pour déterminer les dimensions de votre objet texte avant de le dessiner. Dessinez ensuite commencer à les coordonnées appropriées.La PIL docs pour ImageDraw.texte sont un bon endroit pour commencer, mais ne pas répondre à votre question.
Ci-dessous est un exemple de comment faire pour centrer le texte dans l'arbitraire d'un cadre de sélection, par opposition au centre de l'image. La boîte englobante est défini comme:
(x1, y1)
= coin supérieur gauche et(x2, y2)
= coin inférieur droit.La sortie affiche le texte centré verticalement et horizontalement dans la boîte englobante.
Si vous avez une seule ou plusieurs lignes de message n'a plus d'importance, comme PIL incorporé le
align='center'
paramètre. Cependant, il est pour texte multiligne seulement. Si le message est une ligne unique, il doit être manuellement centré. Si le message est multiligne,align='center'
fait le travail pour vous sur les lignes suivantes, mais vous avez toujours manuellement centre du bloc de texte. Ces deux cas sont résolus à la fois dans le code ci-dessus.