6
votes

Polices coupant avec PIL

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

Le code créé cette image est assez simple en avant (abrégé): xxx

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


4 commentaires

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?


5 Réponses :


0
votes

Ma suggestion est, avant de créer l'objet image, d'obtenir la taille requise pour le texte.

Ceci est fait en utilisant poly.getsize ("texte") ( ).

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 polices.getsize ("ÅJ") (si vous n'avez besoin que de nous ASCII, vous pouvez trouver la hauteur de "aj" à 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.


1 commentaires

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 ...



1
votes

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()


1 commentaires

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).



0
votes

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()


0 commentaires

0
votes

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.

Chaque fois qu'un mot est placé:

1) faire un tirage au sort. Textsize (texte, police = polices) avec votre mot souhaité. Stockez la hauteur / la largeur.

2) Ajouter 'FJ' (Spacefj) à la fin du mot, et refaire le textualisation et le stocker TIS troisième hauteur / largeur.

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.

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».

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. xxx


1 commentaires

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.



3
votes

Voici une réponse tardive pour cette question plus ancienne.

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 texte () 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 ). La fixation de cela provoque d'autres problèmes, comme la douille de texte rendu lettre par lettre.

Certaines solutions incluent:


0 commentaires