使用枕头绘制草书文本

我将在Ubuntu 14.04 LTS机器上托pipe的Django应用程序中的图像上绘制文本。 Pillow 4.2.1是我的select。

我已经通过从PIL导入的ImageDraw成功地完成了这个任务(实际的代码是在这个问题的最后)

我的代码完美适用于英语,法语或西class牙语等语言。

但不适用于阿拉伯语,波斯语或乌尔都语等自然草书 。 在这种情况下,它会分别绘制每个字母。 例如فارسی (波斯)被绘制为:

在这里输入图像说明

请注意,我安装了sudo apt-get install ttf-mscorefonts-installer并尝试了/fonts/truetype/msttcorefonts/Arial.ttf

有人build议我确保我使用的字体连字 。 我的理解是, 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) 

简而言之,这段代码将任何给定的文本分成不同的行,并考虑到字体大小和底层的图像大小。 然后迭代地在图像上绘制每一行文字。

对于这个问题的最好的答案已经解决了这个相当出色的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)