0

我要在Ubuntu 14.04 LTS机器上托管的 Django 应用程序中的图像上绘制文本。Pillow 4.2.1是我选择的库。

我已经通过ImageDraw导入成功完成了这项任务PIL(实际代码在这个问题的末尾)

我的代码非常适用于英语、法语或西班牙语等语言。

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

在此处输入图像描述

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

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

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

4

1 回答 1

0

这个问题的最佳答案已经在这个相当出色的 SO 帖子中得到解决:https ://stackoverflow.com/a/25727238/4936905 。

本质上,这里需要两个 Python 库:BiDiArabic Reshaper.

那是pip install python-bidipip install git+https://github.com/mpcabd/python-arabic-reshaper。确切的实现需要text在通过以下方式绘制之前进行如下转换PIL

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)
于 2017-08-21T20:33:14.073 回答