美文网首页python学习笔记Python
【python实战】批量图片加文字

【python实战】批量图片加文字

作者: Hobbit的理查德 | 来源:发表于2020-03-29 14:16 被阅读0次

    1. 需求

    最近,在网上找了一堆电影剧照和电影台词,想把电影台词批量加到电影剧照上。这就需要能够批量在图片上加文字了。

    此外,有一堆文字素材,而不想纯文本,考虑将文字批量加在纯色图片上,从而发布带有文字的纯色图片。

    2. 过程及效果

    (1) 已有图片加文字

    a. 构造图片加文字的函数

    构造给图片加文字的函数,先安装pip install pillow。根据从网上爬取一批电影剧照和相应的电影台词,就可以通过循环将这些电影剧照加上台词了。

    #导入第三方库
    from PIL import Image,ImageDraw,ImageFont
    # 给图片加文字
    def txt2pic(txt,pic):
        txt=txt.upper()#单词均大写
        txt_list=txt.split(' ')
        #设置几个单词1行,这里设置6个单词一行
        row=int(len(txt_list)/6) 
        ls=[]
        if row<1:
            ls.append(txt)
        else:
            sen_list=[txt_list[i:i+6] for i in range(0,len(txt_list),6)]
            for s in sen_list:
                l=' '.join(s)
                ls.append(l)
    
        # 图片名称
        img=pic
        newpic=pic.split('.')[-2]+'_txt'+'.png'
    
        # 设置字体样式
        font_type = 'C:\\study\\实战\\python\\weibo\\TimesBQ-ExtraBoldItalic.otf'
        font = ImageFont.truetype(font_type, 45)
        color = "#ffffff"
    
        # 打开图片
        image = Image.open(img)
        draw = ImageDraw.Draw(image)
        width, height = image.size
         
        # 文字内容
        txt_x = 50 #从左到右,值越大,越靠右
        txt_y = 550 # 从下往上,值越大,越向上
        txt_line = 100
        for i, t in enumerate(ls):
          y = txt_y - i * txt_line
          draw.text((txt_x, height - y), u'%s' % t, color, font)
    
        # 生成图片
        image.save(newpic, 'png')
    txt='台词'
    pic='图片'
    txt2pic(txt,pic)
    

    b. 效果

    原图片:

    The Shawshank Redemption.jpg
    The Treasure of the Sierra Madre.jpg

    添加台词后:

    The Shawshank Redemption_txt.png The Treasure of the Sierra Madre_txt.png

    (2) 生成纯色图片加文字

    a. 构造生成纯色图片的函数

    构造生成纯色图片的函数后,设置图片颜色和大小,生成相应的png图片,文件以颜色命名。

    #导入第三方库
    from PIL import Image,ImageDraw,ImageFont
    #生成纯色图片
    def create_img(size,colorlist):
        for i in range(len(colorlist)):
            img=Image.new('RGBA',size,colorlist[i])
            img.save(colorlist[i]+'.png')
            
    colorlist=['red','orange','blue']#颜色列表
    size=(1024,683)#图片大小
    create_img(size,colorlist)
    

    根据修改图片加文字的函数来批量生成带文字的纯色图片。

    from PIL import Image,ImageDraw,ImageFont
    #生成纯色图片
    def create_img(size,colorlist):
        for i in range(len(colorlist)):
            img=Image.new('RGBA',size,colorlist[i])
            img.save(colorlist[i]+'.png')
    
    colorlist=['red','orange','blue']
    size=(1024,683)
    create_img(size,colorlist)
    
    # 给图片添加文字
    def txt2pic(txt,pic):
        txt=txt.upper()
        txt_list=txt.split(' ')
        #设置几个单词1行
        row=int(len(txt_list)/4) 
        ls=[]
        if row<1:
            ls.append(txt)
        else:
            sen_list=[txt_list[i:i+4] for i in range(0,len(txt_list),4)]
            for s in sen_list:
                l=' '.join(s)
                ls.append(l)
    
        # 图片名称
        img=pic
        newpic=pic.split('.')[-2]+'_txt'+'.png'
    
        # 设置字体样式
        font_type = 'C:\\study\\实战\\python\\weibo\\TimesBQ-ExtraBoldItalic.otf'
        font = ImageFont.truetype(font_type, 40)
        color = "#ffffff"
    
        # 打开图片
        image = Image.open(img)
        draw = ImageDraw.Draw(image)
        width, height = image.size
         
        # 文字内容
        txt_x = 50 #从左到右,值越大,越靠右
        txt_y = 450 # 从下往上,值越大,越向上
        txt_line = 100
        for i, t in enumerate(ls):
          y = txt_y - i * txt_line
          draw.text((txt_x, height - y), u'%s' % t, color, font)
    
        # 生成图片
        image.save(newpic, 'png')
    
    txtls=["Madame Curie's notebooks are still radioactive. ","Researchers wishing to study them ","must sign a waiver in order to do so. "]
    for i in range(3):
        pic=colorlist[i]+'.png'
        txt=txtls[i]
        txt2pic(txt,pic)
    

    b. 效果

    原图:

    red.png
    orange.png
    blue.png

    添加文字后:

    red_txt.png orange_txt.png blue_txt.png

    相关文章

      网友评论

        本文标题:【python实战】批量图片加文字

        本文链接:https://www.haomeiwen.com/subject/wbzyuhtx.html