2017-08-14 75 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)