type
Post
status
Published
date
Jun 19, 2022
slug
summary
中文文档很赞!
tags
视频剪辑
python
category
探索新世界
icon
password
张老师问我有没有什么好的办法批量生成视频。帮他参考了一下,发现他只有生成答案那里不能自动化。
他的答案是这样的形式呈现:
notion image
很明显,下面5个答案不能做到批量生成,只能一个一个手打上去。一开始我也没有很好的办法,因为我的答案也是五线谱的形式,相对来说没有这么简洁精致。
仔细想了想,分解开来其实就是黑色的方块上加上白色的字。不知道python上关于绘图的库能不能做到这一点

pillow

这是python上的一个图像库,中文文档地址是点击此处。 我需要用到的就是三个模块,分别是:ImageImageDrawImageFont
首先生成一个纯黑色的底版。
from PIL import Image, ImageDraw, ImageFont # 生成一个背景 background=Image.new("RGB", (100, 100), (0,0,0)) background.show()
Image.new()里面需要传入三个参数,具体如下:
  • mode:有"RGB"、"RGBA"等模式。具体可以去参考文档。
  • size:输入一个元组用来表示宽与高的像素。
  • color:输入rgb的数值确定颜色。
show()函数是可以预览生成的图像。效果如下:
notion image
接下来就是要把字母打上去。
from PIL import Image, ImageDraw, ImageFont # 生成一个背景 background=Image.new("RGB", (100, 100), (0,0,0)) # 在背景上生成文字 draw=ImageDraw.Draw(background) draw.text((50,50), "bE",anchor="mm",fill=(255,255,255)) background.show()
因为是要在背景上面添加文字,所有首先要使用ImageDraw.Draw()函数,并传入代表背景的实例background
接下来使用text()函数添加文字。此函数能传入的参数非常多,我选择传入部分。
  • xy:这代表文本的锚点坐标。在上例中我选择了(50,50),因为背景是(100, 100)所以正好是最中心的位置。
  • text:需要添加的文字。如果输入多行文字可能用到multiline_text()函数更加合适,具体参考文档。
  • anchor:文本锚点对齐方式。简单的可以理解文本的中心点在哪里,默认情况下会是左上角。我输入的文本是bE,那么将会从坐标(50,50)即中心点开始绘制文本,显然字是不会在中心的。所以我传入参数anchor="mm",让文本居中对齐。具体参考文档。
  • fill:文本的颜色。用rgb数值来进行控制。
效果如下:
notion image
字虽然是在中间,但是有点太小了。我们还需要对字体大小进行调整。
from PIL import Image, ImageDraw, ImageFont # 设定字体文件与大小 ttf=ImageFont.truetype("/Users/xhhdd/Desktop/Alibaba-PuHuiTi-Medium.ttf", 60) # 生成一个背景 background=Image.new("RGB", (100, 100), (0,0,0)) # 在背景上生成文字 draw=ImageDraw.Draw(background) draw.text((50,50), "bE",anchor="mm",fill=(255,255,255),font=ttf) background.show()
这里使用了ImageFont.truetype()函数,并传入了部分参数进行控制。
  • font:输入字体文件的路径,对字体文件进行加载。
  • size:字体大小,以磅为单位。
接下来在text()函数中添加了font=ttf的参数,确保使用这个字体。效果如下:
notion image
那么这个基本上就跟张老师要的效果相差无几了。最后就是使用save()函数保存即可。如:background.save('black.png')

生成背景图

平时在批量制作视频时,视频封面总是一个麻烦问题。 我一般出一系列就是20个视频,在cdr中制作好一个封面模板之后,再去修改左上角的数字角标。如下:
notion image
还有一个比较重要的问题,就是不同平台的分辨率是不太一样的。像b站的封面就略宽一点,小红书就稍微窄一点。
现在有了pillow之后,我应该可以写一个这样的工具,只需要输入内容就可以自动生成对应平台的封面。
首先是b站的封面,封面比例是16:9,需要大于1146 * 717。我稍微做大一点,定为3438 * 2151。接下来定一下左上角角标的位置,跟正文的位置。
# -*- coding: utf-8 -*- from PIL import Image,ImageDraw,ImageFont def cover(): # 设定字体文件与大小 body_ttf=ImageFont.truetype("/Users/xhhdd/Desktop/Alibaba-PuHuiTi-Medium.ttf",350) make_ttf=ImageFont.truetype("/Users/xhhdd/Desktop/Alibaba-PuHuiTi-Medium.ttf",150) # 生成一个背景 background=Image.new("RGB",background_size,background_color) # 确定角标位置 footnote=ImageDraw.Draw(background) fn_x,fn_y=int(background_size[0]*(1/5)),int(background_size[1]*(1/7)) footnote.text((fn_x,fn_y),footnote_text,anchor="mm",fill=footnote_color,font=make_ttf) # 确定正文位置 body=ImageDraw.Draw(background) bd_x,bd_y=int(background_size[0]*(1/2)),int(background_size[1]*(2/5)) body.multiline_text((bd_x,bd_y),body_text,anchor="mm",fill=body_color,font=body_ttf,spacing=space) background.show() background.save('cover.png') # --------------------------------------- # 调整下列数值即可运行 # 背景颜色|用rgb数值控制 background_color=(252,77,83) # 背景大小|默认是b站的比例3438,2151 background_size=(3438,2151) # 角标的文字 footnote_text='「1」' # 角标的颜色|用rgb数值控制 footnote_color=(255,255,255) # 正文内容 body_text='听\\n单 音' # \\n代表换行符 # 正文文字颜色|用rgb数值控制∂ body_color=(255,255,255) # 两行文字之间的间距 space=200 cover()
效果如下:
notion image
除了下面那行字,效果基本上差不多了~ 加个循环就可以批量生成封面了!
 
音乐分析报告的LaTeX格式「2022-6月」