Writing Text With Diacritic ("nikud", Vocalization Marks) Using Pil (python Imaging Library)
Solution 1:
As for Arabic diacritics : Python +Wand(Python Lib) +arabic_reshaper(Python Lib) +bidi.algorithme(Python Lib). The same applies to PIL/Pillow, you need to use the arabic_reshaper
and bidi.algorithm
and pass the generated text to 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.0for i inrange(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)
Solution 2:
funny, after 5 years, and with great help fron @Nasser Al-Wohaibi, I realized how to do it:
Reversing the text with a BIDI algorithm was needed.
# -*- 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')
@Nasser's answer has extra value that's probably relevant only to arabic texts (the letters in arabic change shape and connected-ness based on their neiboring letters, in hebrew all letters are separate), so only the bidi part was relevant for this question.
in the sample result, the 2nd line is the correct form, and correct vocalization marks positioning.
thank you @tzot for help + code snippets
a-propos:
samples of different font behavior with Hebrew "nikud". Not all fonts behave the same:
Solution 3:
What system are you working on? It works for me on my Gentoo system; the order of the letters is reversed (I just copy-pasted from your question), which seems correct to me although I don't know much about RTL languages.
Python 2.5.4 (r254:67916, May 312009, 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)
produces:
EDIT: I should say that using the Deja Vu Sans
font was not accidental; although I don't like it much (and yet I find its glyphs better than Arial), it's readable, it has extended Unicode coverage, and it seems to work better with many non-MS applications than Arial Unicode MS
.
Solution 4:
for all languages Arabic, Hebrew, Japanese even english you can use this code:
from bidi.algorithm import get_display
importarabic_reshaperfinal_text= get_display(arabic_reshaper.reshape("اللغة العربية"))
this will fix the all problems but don't forget to use Unicode fonts such as enter link description here
Solution 5:
Looks to me that the case is quite simple. You can use True Type fonts and use
Here's the example:True type fonts for PIL
Here you can find Hebrew True Type fonts: Hebrew true type fonts
Good luck or like we saying in Hebrew - Mazal' Tov.
Post a Comment for "Writing Text With Diacritic ("nikud", Vocalization Marks) Using Pil (python Imaging Library)"