2017-08-14 71 views
0

我要在Ubuntu 14.04 LTS機器上託管的Django應用程序中的圖像上繪製文本。 Pillow 4.2.1是我的選擇。使用枕頭繪製草書文本

我已經成功地實現通過ImageDraw這個任務從PIL進口(實際的代碼是在這個問題結束)

我的代碼完全適用於語言,如英語,法語或西班牙語。

但不適用自然草書語言如阿拉伯語,波斯語或烏爾都語。在這種情況下,它會分別繪製每個字母。例如。 فارسی(波斯)繪製成:我安裝sudo apt-get install ttf-mscorefonts-installer,並試圖/fonts/truetype/msttcorefonts/Arial.ttf這個

enter image description here

注意。

有人advised me確保我使用的字體有連字。我的理解是,Arial不支持連字,但問題仍然存在。

我的問題是:我應該怎麼做才能解決這個問題?我的代碼必須支持自然草書語言,如阿拉伯語,波斯語或烏爾都語。


的代碼:

from PIL import ImageDraw 
draw = ImageDraw.Draw(img) 
base_width, base_height = img.size 
y = 2 
for line in lines: 
    width, height = font.getsize(line) 
    x = (base_width - width)/2 
    text_with_stroke(draw,x,y,line,font,fillcolor,shadowcolor) 
    y += height 

其中text_with_stroke很簡單:

def text_with_stroke(draw,width,height,line,font,fillcolor,shadowcolor): 
    draw.text((width-1, height), line, font=font, fill=shadowcolor) 
    draw.text((width+1, height), line, font=font, fill=shadowcolor) 
    draw.text((width, height-1), line, font=font, fill=shadowcolor) 
    draw.text((width, height+1), line, font=font, fill=shadowcolor) 
    draw.text((width, height), line, font=font, fill=fillcolor) 

概括地說,此代碼打破任何給定的文本被分成幾行,同時考慮到的字體大小和基礎圖像大小。然後迭代地在圖像上繪製每行文字。

回答

0

對於這個問題的最佳答案已經解決了這個相當出色的SO帖子:https://stackoverflow.com/a/25727238/4936905

基本上,這裏需要兩個Python庫:BiDiArabic Reshaper

那就是pip install python-bidipip install git+https://github.com/mpcabd/python-arabic-reshaper。具體實施需要在通過PIL繪製之前如下變換text

reshaped_text = arabic_reshaper.reshape(line) 
final_text = get_display(reshaped_text) 

draw.text((width-1, height), final_text, font=font, fill=shadowcolor) 
draw.text((width+1, height), final_text, font=font, fill=shadowcolor) 
draw.text((width, height-1), final_text, font=font, fill=shadowcolor) 
draw.text((width, height+1), final_text, font=font, fill=shadowcolor) 
draw.text((width, height), final_text, font=font, fill=fillcolor)