python学习笔记Python

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

2020-03-29  本文已影响0人  Hobbit的理查德

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
上一篇下一篇

猜你喜欢

热点阅读