我想使用不同的字体在图像上写一些文本。文本使用波斯语(波斯语),对于某些字体,我可以毫无问题地做到这一点。但有许多字体无法正确绘制或根本无法绘制某些字符(仍然占用空间)
这是我的代码:
from os import listdir
from PIL import ImageDraw,Image,ImageFont
import arabic_reshaper
from bidi.algorithm import get_display
text = "فوووتبال"
reshaped_text = arabic_reshaper.reshape(text)
text = get_display(reshaped_text)
fontlist =listdir("fonts")
for fontfile in fontlist:
font = ImageFont.truetype("fonts\\" + fontfile, 80)
fontImage = Image.new("RGB", (500 , 500), (255, 255, 255))
draw = ImageDraw.Draw(fontImage)
draw.text((10, 10), text, (0, 0, 0), font=font)
draw = ImageDraw.Draw(fontImage)
fontImage.show()
某些字体的结果位于以下链接中:
单独使用字体似乎也不是问题,因为在MS Word或其他程序中使用时它们可以正常工作。
编辑:
我发现缺少\ box字符是因为在这些字体中某些字符未定义为Arabic presentation form-B,但是从arabic_reshaper.reshape
出来的文本指向这些unicode代码。例如,在IranNastaliq字体中,Unicode中的字符ل的代码为u+0644
,但arabic_reshaper将该字符更改为u+FEDD
,在伊朗Nastaliq中未定义(但在B nazanin中定义)。
我尝试检查每个字符是否为"\ufedd"
,如果是,请将其更改为"\u0644"
。这适用于这种字符和字体,但是例如W_japan字体中的字符“ ﻟ”(U+FEDF
)被定义为U+FE5A
,这没有任何意义,因为该代码用于“ ﹛”。键入时仍用MS字表示,它将正确识别应呈现的字形。
基于相邻字符的字形更改问题仍然存在。
因此,在这一点上,我唯一的希望是找出MS word如何正确呈现字形。如果有人可以帮助我,我将不胜感激。