Cette image a été créée avec PIL. Voyez comment les g et les y sont coupés dans cette image? Comment puis-je empêcher cela?
http://img109.imageshack.us/img109/8874/screenshotep.png.png.png.png.png p>
Le code créé cette image est assez simple en avant (abrégé): p> Je l'ai essayé avec quelques polices différentes, et Il est toujours coupé. Surprenant; Y, Googleing "Pil Font coupant" revient très peu de hits utiles ... J'utilise Python 2.6.4 et Pil 1.1.6 sur Ubuntu 9.10 P> P>
5 Réponses :
Ma suggestion est, avant de créer l'objet image, d'obtenir la taille requise pour le texte. P>
Ceci est fait en utilisant Dans une image génératrice de script i fait, j'ai d'abord trouvé la hauteur maximale d'une ligne de texte, en appelant l'équivalent de poly.getsize ("texte") code> ( ). p>
polices.getsize ("ÅJ") code> (si vous n'avez besoin que de nous ASCII, vous pouvez trouver la hauteur de
"aj" code> à la place). Ensuite, j'ai calculé la hauteur d'image requise et les compensations de ligne, y compris les marges et l'espacement de la ligne. P>
J'ai déjà essayé quelque chose comme ça. Si la hauteur de la ligne ne suffit pas, PIL va simplement chevaucher le texte au lieu de le couper ...
Je n'ai pas pu résoudre ce problème pour certaines polices à l'aide des approches mentionnées jusqu'à présent, alors j'ai fini par utiliser AggDraw en tant que remplacement transparent des méthodes de Text Drawig de Pil.
Votre code réécrit à AggDraw ressemblerait à: p>
import Image import aggdraw im = Image.new("RGBA", (200, 200), 'white') draw = aggdraw.Draw(im) # note that the color is specified in the font constructor in aggdraw font = aggdraw.Font((0,0,0), "VeraSe.ttf", size=12, opacity=255) draw.text((1, 1), " %s: " % "ggjyfFwe__", font) # no color here draw.text((1, 30), " %s" % 15, font) draw.flush() # don't forget this to update the underlying PIL image! im.show()
Travaux! AGGDRAW a nécessité une certaine correction sur Windows, cependant - AggDraw.cxx pour le crash ( Commentaires.gmane .org / gmane.comp.python.image / 1959 ) et setup.py pour construire avec freeType2 (en obtenu un de gnuwin32).
Le "bogue" existe toujours en 2012, avec Ubuntu 11.10. Fontside 11, 12, 13 et 15 clipse le soulignement complètement.
#!/usr/bin/env python """ demonstrates clipping of descenders for certain font sizes """ import Image, ImageDraw, ImageFont fontPath = "/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans-Bold.ttf" im = Image.new('L', (256, 256)) ys=15 for i in range(10,21): fh = ImageFont.truetype(fontPath, i) sometext="%dgt_}" % (i) ImageDraw.Draw(im).text((10, ys ),sometext , 254, fh) ys+=i+5 im.show()
Voici un KLUDGE qui fonctionne bien pour moi. C'est une variante sur la réponse de Gnud. (Assez différent pour mériter une réponse distincte contre un commentaire J'espère.) J'ai testé beaucoup de placements de mots et cela a été effectué de manière cohérente.
Lorsqu'un texte est dessiné sans atteindre complètement la hauteur de la police, le coupure peut se produire. . Comme Gnud notait, en utilisant des caractères tels que "AJ" (j'utilise "fj"), vous évitez ce bogue. P>
Chaque fois qu'un mot est placé: p>
1) faire un tirage au sort. Textsize (texte, police = polices) avec votre mot souhaité. Stockez la hauteur / la largeur. P>
2) Ajouter 'FJ' (Spacefj) à la fin du mot, et refaire le textualisation et le stocker TIS troisième hauteur / largeur. P>
4) Vous ferez le tirage actuel avec le mot à partir du point 2 (avec la «FJ» à la fin). Ayant cet addenda gardera la police d'être coupée. P>
4) Avant de faire le dessin du texte réel, récoltez l'image où le "FJ" va atterrir (Crop.Load () est nécessaire pour éviter une paresseuse copie). Tracez ensuite le texte et au-delà de l'image recadrée sur le «FJ». P>
Ce processus évite le coupure, semble raisonnablement performant et donne le texte complet et claire. Vous trouverez ci-dessous une copie / pâte d'une section de code Python que j'utilise pour cela. Exemple partiel, mais j'espère qu'il ajoute une idée. P>
L'ajout de «FJ» avec le texte qui est tourné ne semble pas aider et je suis toujours en train de découper. Pas sûr si je fais quelque chose de mal.
Voici une réponse tardive pour cette question plus ancienne. P>
Le problème semble être que PIL et Oreiller clipseront les bords du texte rendu. Cela montre le plus souvent sur des caractères de taille et des décenseurs (comme 'Y's). Cela peut également apparaître sur le dessus de certaines polices. Cela a été un Problème pendant au moins dix ans. Il arrive quelle que soit la taille de l'image sur laquelle Certaines solutions incluent: p>
Ceci est référencé dans diverses questions Polices de police avec PIL , Pil coupe le haut des lettres , Rendez correctement le texte avec une police donnée à Python et détecter avec précision ses limites . Ces questions font référence au même problème sous-jacent mais ne sont pas duplicats p> texte () code> est appelé. Le conflit semble choisir le rectangle de liaison comme "Font.Size * Number_chars" au lieu de "tout ce que j'ai besoin de rendre" et cela se produit profondément dans la pile (
_imingft.c code>). La fixation de cela provoque d'autres problèmes, comme la douille de texte rendu lettre par lettre. P>
im.text (xy, my_text + '', ...) code> li>
poly.getsize () code>), deuxième rendez le texte plus un bon ascendend et descendant, hachez le texte rendu à la première largeur rapportée et la deuxième hauteur réelle. li>
Mieux vaut nous dire des polices spécifiques que vous avez essayées et quelle plate-forme vous êtes sur. Je viens d'essayer ici de win7 avec consola.ttf et n'obtenez pas l'écrouement de fond que vous voyez.
Malheureusement, je n'ai pas Verase.ttf ici, et vous n'avez pas encore mentionné quelle plate-forme vous allez encore. Je soupçonne que Linux, pas Windows, et qu'il s'agit d'un problème spécifique à la plate-forme que vous rencontrez.
Cela se passe également pour moi avec Georgia.ttf (partie du paquet mstcorefonts) à l'aide de PIL 1.1.7 sur Python 2.6 à Ubuntu 9.10. Cela ressemble à un problème avec PIL où le tampon est-il temporairement rendu temporairement n'est pas assez élevé.
Si vous avez toujours des intérêts pour cela, pourriez-vous essayer le patch à Stackoverflow.com/Questtions/13821882/pil-cut-off-letters/... et signaler les résultats?