一、需求
使用PIL处理图片写入文字,并将他图片中的文字居中。
二、实现
使用Draw.textsize计算文字大小并设置位置。
from PIL import Image, ImageDraw
W, H = (300,200)
msg = "hello"
title_font = ImageFont.truetype(font_kechengxinxi, 30)
im = Image.new("RGBA",(W,H),"yellow")
draw = ImageDraw.Draw(im)
w, h = draw.textsize(msg,title_font)
draw.text(((W-w)/2,(H-h)/2), msg, fill="black")
im.save("hi.png", "JPEG")
三、报错解决
报错:
UnicodeEncodeError: 'latin-1' codec can't encode characters in position 6-8: ordinal not in range(256)
对文字先encode,再decode即可。
w, h = draw.textsize(title.encode("utf-8").decode("latin1"))
或者,指定textsize字体:
title_font = ImageFont.truetype(font_kechengxinxi, 30)
w, h = draw.textsize(title,title_font)
title_x = 138
title_y = 39
image_w = 800
image_h= 309
draw.text(((image_w-w)/2, title_y), u'%s' % (title), color, title_font)
这里我采用第二种方法,指定字体,可以避免拉丁编码的问题,其实报错也是因为字体的原因。