2011-11-24 76 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

您將需要首先將文本分成正確長度的行,然後分別繪製每一行。

第二部分很簡單,但如果使用寬度可變的字體,第一部分可能會非常困難。如果固定寬度的字體使用,或者如果精度不那麼重要,那麼你可以只使用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

接受的包裝文字築底在每行40個字符的固定限制上,不考慮盒子寬度(以像素爲單位)或字體大小。這可能很容易導致底部填充或溢出。

這裏是一個更好的解決方案 - 一種簡單的代碼段使用基於字體寬度測量來處理文本換行: - 即以適合的圖像上 https://gist.github.com/turicas/1455973