2009-06-14 13 views
7

L'écriture d'un texte simple sur une image en utilisant PIL est facile.Ecriture de texte avec diacritique ("nikud", marques de vocalisation) en utilisant PIL (Python Imaging Library)

draw = ImageDraw.Draw(img) 
draw.text((10, y), text2, font=font, fill=forecolor) 

Cependant, lorsque je tente d'écrire des signes de ponctuation hébreux (appelée « nikud » ou ניקוד), les caractères ne se chevauchent pas comme ils le devraient. Sur l'environnement de support, ces deux mots occupent le même espace/largeur (l'exemple ci-dessous dépend de votre système, donc de l'image):

סֶפֶר ספר

Cependant lors de l'élaboration du texte avec PIL je reçois:

ס ֶ פ ֶ ר

depuis la bibliothèque ne probablement respecte pas le règlement crénage (?).

Est-il possible que le caractère et la marque de ponctuation hébraïque occupent le même espace/largeur sans écrire manuellement le positionnement des caractères?

image - nikud and letter spacing http://tinypic.com/r/jglhc5/5

URL de l'image: http://tinypic.com/r/jglhc5/5

Répondre

2

drôle, au bout de 5 ans, et avec une grande aide Fron @ Nasser Al-Wohaibi, j'ai réalisé comment le faire:

Inverser le texte avec un algorithme BIDI était nécessaire.

# -*- coding: utf-8 -*- 
from bidi.algorithm import get_display 
import PIL.Image, PIL.ImageFont, PIL.ImageDraw 
img= PIL.Image.new("L", (400, 200)) 
draw = PIL.ImageDraw.Draw(img) 
font = PIL.ImageFont.truetype(r"c:\windows\fonts\arial.ttf", 30) 
t1 = u'סֶפֶר ספר!' 
draw.text((10,10), 'before BiDi :' + t1, fill=255, font=font) 

t2 = get_display(t1)  # <--- here's the magic <--- 
draw.text((10,50), 'after BiDi: ' + t2, fill=220, font=font) 

img.save('bidi-test.png') 

@ réponse de Nasser a une valeur supplémentaire qui est probablement pertinent aux textes arabes (les lettres en forme de changement arabe et-ness connecté en fonction de leurs lettres de neiboring, en hebrew toutes les lettres sont séparées), de sorte que la partie bidi était pertinent pour cette question.

dans le résultat de l'échantillon, la deuxième ligne est la forme correcte et le positionnement correct des marques de vocalisation.

before and after bidi

merci @tzot aide + extraits de code

a-propos:

échantillons de comportement différent de la police avec l'hébreu "nikud". Toutes les polices ne se comportent pas de la même manière: sample PIL written, bidi hebrew text, with nikud, in different fonts

+0

Salut, j'ai eu un ** [problème similaire en utilisant Pillow] (http://stackoverflow.com/questions/41271620/the-nikud-are-not-aligned -propriement-en-dessin-texte-en-hébreu-en-utilisant-pil-pytho) **. Avez-vous déjà trouvé une solution pour aligner le nikud indépendamment de la police? – maltman

0

me semble que le cas est assez simple. Vous pouvez utiliser des polices True Type et utilisez

Voici l'exemple: True type fonts for PIL

Ici vous pouvez trouver hébreu polices True Type: Hebrew true type fonts

Bonne chance ou comme nous dire en hébreu - Mazal » Tov.

+0

Merci d'avoir répondu, mais vous n'avez pas répondu à la question. Comme je l'ai écrit - je sais écrire des TTF, et j'ai déjà des polices TTF. –

2

Sur quel système travaillez-vous? Cela fonctionne pour moi sur mon système Gentoo; l'ordre des lettres est inversé (je viens de copier-coller de votre question), ce qui me semble correct bien que je ne connaisse pas grand-chose aux langages RTL.

Python 2.5.4 (r254:67916, May 31 2009, 16:56:01) 
[GCC 4.3.3] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import Image as I, ImageFont as IF, ImageDraw as ID 
>>> t= u"סֶפֶר ספר" 
>>> t 
u'\u05e1\u05b6\u05e4\u05b6\u05e8 \u05e1\u05e4\u05e8' 
>>> i= I.new("L", (200, 200)) 
>>> d= ID.Draw(i) 
>>> f= IF.truetype("/usr/share/fonts/dejavu/DejaVuSans.ttf", 20) 
>>> d1.text((100, 40), t, fill=255, font=f) 
>>> i.save("/tmp/dummy.png", optimize=1) 

produit:

the example text rendered as white on black http://i39.tinypic.com/2j9jxf.png

EDIT: Je dois dire que l'utilisation de la police Deja Vu Sans n'a pas été accidentelle; Bien que je ne l'aime pas beaucoup (et pourtant je trouve ses glyphes mieux que Arial), il est lisible, il a étendu la couverture Unicode, et il semble fonctionner mieux avec beaucoup d'applications non MS que Arial Unicode MS.

+0

Vous n'avez pas vraiment répondu, mais vous aidez à voir le bug: Seuls DejaVuSans.ttf et Lucidaxxx.ttf se comportent correctement sous PIL! Tout le reste de mes fichiers TTF produit une mauvaise sortie (mais ils se comportent bien en dehors de PIL) Vous pouvez essayer d'autres polices, par exemple. Arial.ttf –

+1

Une police TrueType (ou une police OpenType) ne signifie pas nécessairement que c'est une police complète et utile dans toutes les applications. Michael Kaplan (travaillant pour MS actuellement et très lié aux problèmes d'Unicode) appelle ArialUni une "police de MS Office", pas une "police de système d'exploitation", peu importe ce qu'il veut dire par là, ici: http://blogs.msdn.com/michkap/ archive/2007/07/15/3890144.aspx – tzot

8

Quant à Arabe diacritiques: Python + Baguette (Python Lib) + arabic_reshaper (Python Lib) + bidi.algorithme (Python Lib).De même pour PIL/oreiller, vous devez utiliser la arabic_reshaper et bidi.algorithm et passer le texte généré à draw.text((10, 25), artext, font=font):

from wand.image import Image as wImage 
from wand.display import display as wdiplay 
from wand.drawing import Drawing 
from wand.color import Color 
import arabic_reshaper 
from bidi.algorithm import get_display 

reshaped_text = arabic_reshaper.reshape(u'لغةٌ عربيّة') 
artext = get_display(reshaped_text) 

fonts = ['C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\DroidNaskh-Bold.ttf', 
     'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit.ttf', 
     'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Bold-Oblique.ttf', 
     'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Bold.ttf', 
     'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Oblique.ttf', 
     'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\majalla.ttf',   
     'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\majallab.ttf', 

     ] 
draw = Drawing() 
img = wImage(width=1200,height=(len(fonts)+2)*60,background=Color('#ffffff')) 
#draw.fill_color(Color('#000000')) 
draw.text_alignment = 'right'; 
draw.text_antialias = True 
draw.text_encoding = 'utf-8' 
#draw.text_interline_spacing = 1 
#draw.text_interword_spacing = 15.0 
draw.text_kerning = 0.0 
for i in range(len(fonts)): 
    font = fonts[i] 
    draw.font = font 
    draw.font_size = 40 
    draw.text(img.width/2, 40+(i*60),artext) 
    print draw.get_font_metrics(img,artext) 
    draw(img) 
draw.text(img.width/2, 40+((i+1)*60),u'ناصر test') 
draw(img) 
img.save(filename='C:\\PATH\\OUTPUT\\arabictest.png'.format(r)) 
wdiplay(img) 

Arabic typography in images

Questions connexes