2011-10-08 10 views
23

이미지 하단에 텍스트를 추가하려고했지만 사실은 텍스트를 추가하려고했지만 이미지의 너비가 더 길면 이미지 너비가 양쪽에서 잘려 단순화됩니다. 텍스트 폭이 이미지 너비보다 길면 텍스트가 여러 줄로 표시됩니다. 각 최대 width 자, 당신은 문자열 목록에 text을 깰 textwrap.wrap를 사용할 수파이썬 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

: 여기 내 코드입니다

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 일 경우 첫 번째 단어 바로 다음에 줄이 바뀝니다. 첫 번째 단어와 두 번째 단어가 맞지 않을 수 있기 때문입니다. – 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 이름을 사용 spacing 또는 align을 설정합니다.

+0

작동하지 않습니다. 방금 시도했습니다. 유스 케이스를 자세히 설명해 주시겠습니까? 정말 긴 문자열을'text'로 넘겼고 다음 줄로 넘어 가지 않았습니다. –

+0

@HassanBaig 당신이 문자열에서 휴식을 사용 했습니까? 예를 들면 : "Lorem Ipsum은 단순히 인쇄 \ n 및 조판 업계의 가짜 \ n 텍스트입니다." –

+0

텍스트는 사용자 입력에서 나옵니다. 따라서 다음 줄을 지정하기 위해 구분을 사용하지 않습니다. 나 자신을 오버플로 처리해야합니다. –

3

허용되는 답변은 글꼴을 측정하지 않고 텍스트를 줄 바꿈하므로 글꼴 크기와 상자 너비에 상관없이 최대 40 자까지 입력 할 수 있으므로 결과는 대략적인 것이며 결과가 너무 많아서 상자가 너무 많이 채워 지거나 채워질 수 있습니다. https://gist.github.com/turicas/1455973

+0

이것이 최고의 답변입니다. 6 년 전에 받아 들여 졌기 때문에 대답을 바꾸려고 노력해야합니다. –

관련 문제