2009-12-28 221 views

回答

61

使用Draw.textsize method來計算文字大小並相應地重新計算位置。

下面是一個例子:

from PIL import Image, ImageDraw 

W, H = (300,200) 
msg = "hello" 

im = Image.new("RGBA",(W,H),"yellow") 
draw = ImageDraw.Draw(im) 
w, h = draw.textsize(msg) 
draw.text(((W-w)/2,(H-h)/2), msg, fill="black") 

im.save("hello.png", "PNG") 

和結果:

image with centered text

+5

draw.textsize :(自身,文本,字體=無) – WeizhongTu 2015-06-12 03:26:52

+4

如果字體大小不同,請務必包含如下字體: 'draw.textsize(msg,font = myFont)',否則獲勝沒有正確居中 – Coco 2017-02-23 09:40:38

2

使用textsize方法(請參閱docs)在實際繪製文本對象之前計算出文本對象的尺寸。然後從適當的座標處開始繪製它。

42

這裏是使用textwrap分割一個長行成碎片一些示例代碼,然後使用該textsize方法來計算位置。

from PIL import Image, ImageDraw, ImageFont 
import textwrap 

astr = '''The rain in Spain falls mainly on the plains.''' 
para = textwrap.wrap(astr, width=15) 

MAX_W, MAX_H = 200, 200 
im = Image.new('RGB', (MAX_W, MAX_H), (0, 0, 0, 0)) 
draw = ImageDraw.Draw(im) 
font = ImageFont.truetype(
    '/usr/share/fonts/truetype/msttcorefonts/Arial.ttf', 18) 

current_h, pad = 50, 10 
for line in para: 
    w, h = draw.textsize(line, font=font) 
    draw.text(((MAX_W - w)/2, current_h), line, font=font) 
    current_h += h + pad 

im.save('test.png') 

enter image description here

+0

+1可選字體參數的使用示例 – btk 2012-03-21 03:52:21

9

請注意Draw.textsize方法不準確。我正在處理低像素圖像,經過一些測試,結果證明textsize認爲每個字符的寬度是6像素,而「I」則是最大的。 2個像素和一個「W」需要分鐘。 8像素(在我的情況)。所以,根據我的文字,它是或根本不居中。雖然,我想「6」是一個平均值,所以如果你使用長文本和大圖片,它應該還是可以的。

但現在,如果你想要一些真正的精度,更好的使用你要使用的字體對象的getSize方法對應:

arial = ImageFont.truetype("arial.ttf", 9) 
w,h = arial.getsize(msg) 
draw.text(((W-w)/2,(H-h)/2), msg, font=arial, fill="black") 

正如Edilio的鏈接使用。

+0

不是OP的問題的答案,而是很好的急需功能。 1+ – ddlab 2018-01-13 10:39:51

+0

重要提示:此函數'getsize'接受非拉丁字符,如€或德語變音符號。 'textsize'不。豎起大拇指 :-) – ddlab 2018-01-16 10:09:19