8

PILを使用して画像に簡単なテキストを書くのは簡単です。

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

ただし、ヘブライ語の句読点(「nikud」またはניקודと呼ばれる)を書き込もうとすると、文字が重ならないようになります。(この質問は、アラビア語や他の同様の言語にも関連していると思います。)

サポート環境では、これらの2つの単語は同じスペース/幅を占めます(以下の例はシステムによって異なります。したがって、イメージです)。

סֶפֶרספר

ただし、PILを使用してテキストを描画すると、次のようになります。

סֶפֶר

ライブラリはおそらくカーニング(?)ルールに従わないからです。

文字の位置を手動で書かなくても、文字とヘブライ語の句読点が同じスペース/幅を占めるようにすることは可能ですか?

画像-ニクダーと文字の間隔http://tinypic.com/r/jglhc5/5

画像のURL: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_reshaperandを使用してbidi.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-Wohabi の多大な助けを借りて、その方法に気づきました。

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 のサンプル、bidi ヘブライ語テキスト、ニクッド付き、さまざまなフォント

于 2014-09-09T18:22:34.787 に答える
-2

ケースは非常に単純だと私には思えます。TrueTypeフォントを使用して使用できます

次に例を示します。PILのTrueTypeフォント

ここでは、ヘブライ語TrueTypeフォントを見つけることができます: ヘブライ語TrueTypeフォント

幸運か、ヘブライ語で言っているように-Mazal'Tov。

于 2009-06-15T00:10:06.970 に答える