【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.jpgThe 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.pngorange.png
blue.png
添加文字后:
red_txt.png orange_txt.png blue_txt.png