2011-11-24 8 views
11

PILを使用して画像にテキストを描画しています。どのようにテキストの文字列を折り返しますか?これは私のコードです:PILのテキストを囲む

text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 

image = Image.open("/tmp/background-image.jpg") 
draw = ImageDraw.Draw(image) 
font = ImageFont.truetype("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"), 50, encoding='unic') 
draw.text((100, 100), text, font=font, fill="#aa0000") 
image.save("/tmp/image.jpg") 

答えて

10

最初にテキストを適切な長さの行に分割し、各行を個別に描画する必要があります。

2番目の部分は簡単ですが、最初の部分は可変幅のフォントが使用されている場合は正確に行うのが難しい場合があります。固定幅フォントが使用されている、または精度が問題でそれほどしない場合は、単に与えられた文字幅のラインにテキストを分割するtextwrapモジュールを使用することができた場合:

margin = offset = 40 
for line in textwrap.wrap(text, width=40): 
    draw.text((margin, offset), line, font=font, fill="#aa0000") 
    offset += font.getsize(line)[1] 
+0

これは、文字の数ではなく、実際の幅によって分割される - 画像に合わせて、すなわち – User

3

さて、あなたは、\ nはあなたがテキストを折り返すしたいすべての時間を使用して、もちろん、手動でこれを行うことができます。毎回違う文字列を持っていても、結果を完全に制御できるなら、これは最善の方法ではありません。 しかし、textwrapモジュールもあります。

import textwrap 
texto = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum." 
novo = textwrap.wrap(texto, width=20) 
print(novo) 

結果::

>>> 
['Lorem ipsum dolor', 'sit amet,', 'consectetur', 'adipisicing elit,', 'sed do eiusmod', 'tempor incididunt ut', 'labore et dolore', 'magna aliqua. Ut', 'enim ad minim', 'veniam, quis nostrud', 'exercitation ullamco', 'laboris nisi ut', 'aliquip ex ea', 'commodo consequat.', 'Duis aute irure', 'dolor in', 'reprehenderit in', 'voluptate velit esse', 'cillum dolore eu', 'fugiat nulla', 'pariatur. Excepteur', 'sint occaecat', 'cupidatat non', 'proident, sunt in', 'culpa qui officia', 'deserunt mollit anim', 'id est laborum.'] 
あなたはdeterminated幅に合わせて折り返さ前の文字列上の用語のリストを返します

あなたはそれをこのように使用することができます。

0

受け入れラップテキスト基点ボックスの幅(ピクセル単位)またはフォントサイズを考慮しないで、1行に40文字の固定された制限を適用します。これは容易にアンダーフィルまたはオーバーフィルにつながる可能性があります。ここで

は、より良いソリューションです - フォントベースの幅の測定値を使用してテキストの折り返しを処理するための簡単なコードスニペット: https://gist.github.com/turicas/1455973

関連する問題