2009-06-14 5 views
7

PILを使用して画像に簡単なテキストを書き込むことは簡単です。PIL(Python Imaging Library)を使用して発音区別記号( "nikud"、発声マーク)でテキストを書く

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

、私は彼らが必要と文字が重なっていない(「nikud」またはניקודと呼ばれる)ヘブライ語の句読点を、書いてみます。

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

סֶפֶרספרPILでテキストを描画するとき

しかし私が手:

סֶפֶר

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

手動で文字の配置を行わずに、文字とヘブライ語の句読点を同じスペース/幅にすることはできますか?

image - nikud and letter spacing http://tinypic.com/r/jglhc5/5

画像URL:http://tinypic.com/r/jglhc5/5

答えて

2

面白い、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') 

ので、唯一の双方向部分、のみアラビアテキスト(アラビア変更形状と接続ネスの文字が自分のneiboringの手紙をもとに、ヘブライ語のすべての文字が分離されている)に、おそらく関連性の付加価値を持っていますこの質問に関連していました。

サンプル結果では、 2行目が正しい形式であり、正しい発声マークの位置付けです。

before and after bidi

あなたは、ヘルプ+コードの@tzot感謝

-Proposのスニペット:ヘブライ語の "nikud" と異なるフォント行動の

サンプル。すべてのフォントが同じように動作するわけではありません。 sample PIL written, bidi hebrew text, with nikud, in different fonts

+0

こんにちは、私は** [枕を使用して同様の問題があった](http://stackoverflow.com/questions/41271620/the-nikud-are-not-aligned - 正しく描画中のテキスト - ヘブライ使用 - ピルピソ)**。あなたは、フォントに関係なくニコドを適切に整列させるための修正を見つけましたか? – maltman

0

はケースが非常に簡単であるように私には見えます。あなたはのTrue Typeフォントを使用し、ここでは一例だ

を使用することができます。True type fonts for PIL

ここでは、ヘブライ語のTrue Typeフォントを見つけることができます。 Hebrew true type fonts

幸運か、私たちはヘブライ語で言うような - Mazal」サートフ。

+0

返信いただきありがとうございます。私が書いたように、私はTTFを書く方法を知っています。私はすでにTTFフォントを持っています。 –

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) 

は生成します。

the example text rendered as white on black http://i39.tinypic.com/2j9jxf.png

編集:私はDeja Vu Sansフォントを使用することは偶然ではないだったと言うべきです。私はそれほど好きではありませんが(しかも、Arialよりもグリフが優れています)、読みやすく、Unicodeの適用範囲が広がり、多くのnon-MSアプリケーションではArial Unicode MSよりうまくいくようです。パイソン+ ワンド(パイソンのLib)+ arabic_reshaper(パイソンのLib)+ bidi.algorithme(パイソンのLib):アラビア発音区別符号として

+0

あなたは本当に答えなかったが、バグを見るのを助ける: DejaVuSans.ttfとLucidaxxx.ttfだけがPILで正しく動作する! 残りのすべてのTTFファイルが間違った出力を生成しました(ただし、PILの外でうまく動作します)。 他のフォントを試すことができます。 Arial.ttf –

+1

TrueTypeフォント(またはOpenTypeフォント)は、すべてのアプリケーションで完全で便利なフォントであるとは限りません。マイケル・カプラン(現MS、そしてUnicodeの問題に非常に関連しています)は、ArialUniを「OSフォント」ではなく「MS Officeフォント」と呼んでいます。その意味は、次のとおりです。http://blogs.msdn.com/michkap/アーカイブ/ 2007/07/15/3890144.aspx – tzot

8

。同じことがPILに適用される/枕は、あなたが使用する必要がarabic_reshaperbidi.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) 

Arabic typography in images

関連する問題