在使用PIL编写文字在图片上时,我们在知道api是只能编写一行,但是我们想要实现下图的描述文本的换行效果。
这个我们可以很简单的想到直接对文本做遍历计算长度切割就可以
# 设置字符串长度
def SetFixedStrLength(text):
font = ImageFont.truetype('Arial Unicode.ttf', 20)
# print(font.getsize(text))
strList = []
newStr = ''
index = 0
for item in text:
newStr += item
if font.getsize(newStr)[0] > 380:
# print(font.getsize(newStr)[0])
strList.append(newStr)
newStr = ''
# 如果后面长度不没有定长长就返回
if font.getsize(text[index:])[0] < 415:
strList.append(text[index:])
break
index += 1
resStr = ''
count = 0
for item in strList:
resStr += item+'\n'
count += 1
return resStr, count
我们可以使用textwrap包来根据计算
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')
参考文章:
https://blog.csdn.net/weixin_41768265/article/details/80338439
https://stackoverrun.com/cn/q/397428
网友评论