Python PIL 长文本换行

字数 111阅读 718

在使用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

推荐阅读更多精彩内容