用pyton制作文字特效
先上两张效果图
基本结构
总结文字特效的特点是,每个文字独立运动,都符合同一个运动规律,但每个文字之间保持一个固定的时间差。每个字的运动可以分成三个部分,字体大小的变化、文字位置的变化、文字颜色(透明度)的变化。
# 把每个文字与它的三个运动结合为一个基本单位
def newTextMotion(char, posFunc, sizeFunc, colorFunc):
tm={
}
tm['char']=char
tm['posFunc']= posFunc
tm['sizeFunc']= sizeFunc
tm['colorFunc']= colorFunc
return tm
文字动效的展示
在任意一个时间点上,获得文字的显示效果。
# 在指定的时间,计算文字的位置、大小、颜色等
def showText(img, textMotion, time):
char= textMotion['char']
pos= textMotion['posFunc'](time)
size= textMotion['sizeFunc'](time)
color= textMotion['colorFunc'](time)
font= ImageFont.truetype(fontName, size)
draw = ImageDraw.Draw(im=img)
textSize= draw.textsize(text=char, font=font)
tx= pos[0]- textSize[0]// 2
ty= pos[1]- textSize[1]// 2
draw.text(xy=(tx, ty), text=char, fill=color, font=font)
针对一组文字,形成一个列表,获取起每个时间点的显示图,作为一帧
def getTextFrame(tmList, time):
textImg= Image.new('RGBA', (1280, 720))
for tm in tmList:
showText(textImg, tm, time)
return textImg
具体文字运动规律
下面看看这两种特效的具体运动规律。乍一看比较复杂,但拆分为三个运动后,其实每种都比较简单。以此为模块,读者可以自行制作更多的文字特效。
# 文字缩小
def makeTextShrink(char, toSize, toPos, toColor, offset, dur):
def colorFunc(time):
if time< offset:
return (0,0,0,0)
if time> offset+ dur:
return toColor
return toColor[:-1] + (50+ round((time-offset)/dur*200),)
def sizeFunc(time):
if time< offset:
return toSize* 8
if time> offset+ dur:
return toSize
return toSize*8 - round((time-offset)/dur* toSize*7.5)