2011-10-08 223 views
23

画像の下にテキストを追加しようとしましたが、実際にはそれをやったことがありますが、テキストの長さが長い場合は画像の幅が両側から切り取られてしまいます画像の幅よりも長い場合は、複数の行になるようにテキストを変換します。ここに私のコードは次のとおりです。python PIL画像上に複数行のテキストを描く

FOREGROUND = (255, 255, 255) 
WIDTH = 375 
HEIGHT = 50 
TEXT = 'Chyba najwyższy czas zadać to pytanie na śniadanie \n Chyba najwyższy czas zadać to pytanie na śniadanie' 
font_path = '/Library/Fonts/Arial.ttf' 
font = ImageFont.truetype(font_path, 14, encoding='unic') 
text = TEXT.decode('utf-8') 
(width, height) = font.getsize(text) 

x = Image.open('media/converty/image.png') 
y = ImageOps.expand(x,border=2,fill='white') 
y = ImageOps.expand(y,border=30,fill='black') 

w, h = y.size 
bg = Image.new('RGBA', (w, 1000), "#000000") 

W, H = bg.size 
xo, yo = (W-w)/2, (H-h)/2 
bg.paste(y, (xo, 0, xo+w, h)) 
draw = ImageDraw.Draw(bg) 
draw.text(((w - width)/2, w), text, font=font, fill=FOREGROUND) 


bg.show() 
bg.save('media/converty/test.png') 

答えて

33

あなたが長く、最もwidth文字でそれぞれ、文字列のリストにtextを破るためにtextwrap.wrapを使用することができます。

import textwrap 
lines = textwrap.wrap(text, width=40) 
y_text = h 
for line in lines: 
    width, height = font.getsize(line) 
    draw.text(((w - width)/2, y_text), line, font=font, fill=FOREGROUND) 
    y_text += height 
+0

どうもありがとう!ちょうどコピーして貼り付け、それは魅力のように動作します。あなたは最高です:) – user985541

+0

「40」とは何ですか? – User

+1

@ユーザ '40'は最大文字を表します。それは、新しい行に折り返す前に、最大または40文字を許すことを意味します。しかし、ある単語が10文字、次に31文字の場合は、最初の単語の直後に折り返されます。最初の単語と2番目の単語が一致しないためです。 – teewuane

0
text = textwrap.fill("test ",width=35) 
self.draw.text((x, y), text, font=font, fill="Black") 
+1

ようこそ!これがどのように問題を解決するのかを説明するのがとても親切なことができますか?余分なテキストのビットは、他のユーザーのために長い道のりを行くだろう。 –

+0

これは、@ unutbuの答えのより簡潔なバージョンです。これは現在推奨されている最良のコードであり、もう少し説明すれば受け入れられた答えになるはずです。 – Quantum7

-2

あなたはPIL.ImageDraw.Draw.multiline_text()を使用することができます。

draw.multiline_text((WIDTH, HEIGHT), TEXT, fill=FOREGROUND, font=font) 

あなたも同じのparamの名前を使用してspacingalignを設定します。

+0

動作しません、私はそれを試しました。ユースケースを詳しく説明できますか?本当に長い文字列を 'text'として渡し、次の行に折り返しませんでした。 –

+0

@HassanBaigは文字列に改行を使用しましたか?例: "Lorem Ipsumは印刷物のダミー\ nテキストです\ nと植字業界です。" –

+0

テキストはユーザーの入力から来ているので、次の行を指定するために改行を使用していません。私は自分でオーバーフローを処理する必要があります。 –

3

受け入れられる答えは、フォントを測定せずにテキストをラップするので(最大40文字、フォントサイズとボックスの幅に関係なく)、結果は近似値に過ぎず、ボックスがオーバーフィルまたはアンダーフィルされる可能性があります。ここで

が正しく問題を解決し、簡単なライブラリです: https://gist.github.com/turicas/1455973

+0

これは最高の答えです。私たちは6年前に受け入れられたので、受け入れられた答えを変更しようとするべきです.. –

関連する問題