8

使用 PIL 在图像上编写简单的文本很容易。

draw = ImageDraw.Draw(img)
draw.text((10, y), text2, font=font, fill=forecolor )

但是,当我尝试编写希伯来语标点符号(称为“nikud”或 ניקוד)时,字符不会按应有的重叠。(我猜这个问题也与阿拉伯语和其他类似语言有关。)

在支持环境中,这两个词占用相同的空间/宽度(以下示例取决于您的系统,因此图像):

סֶפֶר ספר

但是,当使用 PIL 绘制文本时,我得到:

ס ֶ פ ֶ ר

因为图书馆可能不遵守字距调整(?)规则。

是否可以让字符和希伯来语标点符号占用相同的空间/宽度而无需手动编写字符定位?

图片 - nikud 和字母间距 http://tinypic.com/r/jglhc5/5

图片网址:http ://tinypic.com/r/jglhc5/5

4

5 回答 5

9

至于阿拉伯语变音符号:Python + Wand (Python Lib) +arabic_reshaper(Python Lib) +bidi.algorithme(Python Lib)。这同样适用于PIL/Pillow,您需要使用arabic_reshaperandbidi.algorithm并将生成的文本传递给draw.text((10, 25), artext, font=font)

from wand.image import Image as wImage
from wand.display import display as wdiplay
from wand.drawing import Drawing
from wand.color import Color
import arabic_reshaper
from bidi.algorithm import get_display

reshaped_text = arabic_reshaper.reshape(u'لغةٌ عربيّة')
artext = get_display(reshaped_text)

fonts = ['C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\DroidNaskh-Bold.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Bold-Oblique.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Bold.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\Thabit-Oblique.ttf',
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\majalla.ttf',         
         'C:\\Users\\PATH\\TO\\FONT\\Thabit-0.02\\majallab.ttf',

         ]
draw = Drawing()
img =  wImage(width=1200,height=(len(fonts)+2)*60,background=Color('#ffffff')) 
#draw.fill_color(Color('#000000'))
draw.text_alignment = 'right';
draw.text_antialias = True
draw.text_encoding = 'utf-8'
#draw.text_interline_spacing = 1
#draw.text_interword_spacing = 15.0
draw.text_kerning = 0.0
for i in range(len(fonts)):
    font =  fonts[i]
    draw.font = font
    draw.font_size = 40
    draw.text(img.width / 2, 40+(i*60),artext)
    print draw.get_font_metrics(img,artext)
    draw(img)
draw.text(img.width / 2, 40+((i+1)*60),u'ناصر test')
draw(img)
img.save(filename='C:\\PATH\\OUTPUT\\arabictest.png'.format(r))
wdiplay(img)

图像中的阿拉伯语排版

于 2014-09-08T14:59:38.380 回答
5

有趣的是,5 年后,在@Nasser Al-Wohaibi 的大力帮助下,我意识到如何做到这一点:

需要使用 BIDI 算法反转文本。

# -*- coding: utf-8 -*-
from bidi.algorithm import get_display
import PIL.Image, PIL.ImageFont, PIL.ImageDraw
img= PIL.Image.new("L", (400, 200))
draw = PIL.ImageDraw.Draw(img)
font = PIL.ImageFont.truetype( r"c:\windows\fonts\arial.ttf", 30)
t1 = u'סֶפֶר ספר!'
draw.text( (10,10), 'before BiDi :' + t1, fill=255, font=font)

t2 = get_display(t1)        # <--- here's the magic <---
draw.text( (10,50), 'after BiDi: ' + t2, fill=220, font=font)

img.save( 'bidi-test.png')

@Nasser 的答案具有额外的价值,可能仅与阿拉伯语文本相关(阿拉伯语中的字母会根据它们的邻接字母改变形状和连通性,在希伯来语中所有字母都是分开的),因此只有比迪部分与这个问题相关。

在示例结果中,第 2 行是正确的形式,正确的发声标记定位。

比迪酒之前和之后

谢谢@tzot 的帮助 + 代码片段

一个提议:

希伯来语“nikud”的不同字体行为示例。并非所有字体的行为都相同: 样本 PIL 书面,比迪希伯来语文本,带有 nikud,不同字体

于 2014-09-09T18:22:34.787 回答
2

你在做什么系统?它适用于我的 Gentoo 系统;字母的顺序是颠倒的(我只是从你的问题中复制粘贴),这对我来说似乎是正确的,尽管我对 RTL 语言不太了解。

Python 2.5.4 (r254:67916, May 31 2009, 16:56:01)
[GCC 4.3.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import Image as I, ImageFont as IF, ImageDraw as ID
>>> t= u"סֶפֶר ספר"
>>> t
u'\u05e1\u05b6\u05e4\u05b6\u05e8 \u05e1\u05e4\u05e8'
>>> i= I.new("L", (200, 200))
>>> d= ID.Draw(i)
>>> f= IF.truetype("/usr/share/fonts/dejavu/DejaVuSans.ttf", 20)
>>> d1.text( (100, 40), t, fill=255, font=f)
>>> i.save("/tmp/dummy.png", optimize=1)

产生:

示例文本呈现为黑底白字

编辑:我应该说使用Deja Vu Sans字体不是偶然的;虽然我不太喜欢它(但我发现它的字形比 Arial 更好),但它是可读的,它扩展了 Unicode 覆盖范围,而且它在许多非 MS 应用程序中似乎比Arial Unicode MS.

于 2009-06-19T21:26:31.337 回答
1

对于所有语言阿拉伯语、希伯来语、日语甚至英语,您都可以使用以下代码:

from bidi.algorithm import get_display
import arabic_reshaper
final_text = get_display(arabic_reshaper.reshape("اللغة العربية"))

这将解决所有问题,但不要忘记使用 Unicode 字体,例如在此处输入链接描述

于 2021-03-29T15:15:20.573 回答
-2

在我看来,这个案子很简单。您可以使用 True Type 字体并使用

这是示例:PIL 的 True type 字体

在这里您可以找到希伯来语 True Type 字体: 希伯来语 True Type 字体

祝你好运,或者就像我们在希伯来语中所说的那样 - Mazal' Tov。

于 2009-06-15T00:10:06.970 回答