无法使用某些字体在图像上写unicode文本

时间:2018-08-06 09:15:37

标签: python fonts python-imaging-library persian

我想使用不同的字体在图像上写一些文本。文本使用波斯语(波斯语),对于某些字体,我可以毫无问题地做到这一点。但有许多字体无法正确绘制或根本无法绘制某些字符(仍然占用空间)

这是我的代码:

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()

某些字体的结果位于以下链接中:

  • result表示B nazanin字体,没关系
  • result:适用于IranNastaliq字体,其中显示的是框而不是某些字符,而其他字符也没有正确呈现。desired image
  • result for IRRoya字体,其中丢失了与IranNastaliq中的框相同的字符,但会占用空格。

单独使用字体似乎也不是问题,因为在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如何正确呈现字形。如果有人可以帮助我,我将不胜感激。

0 个答案:

没有答案