本文主要是介绍moviepy中文字符特效,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
moviepy文档中给出了一个《移动的字母》的程序实例。代码写的有些繁琐,而且对于中文字符也会出错,在这里修正一下,使其支持中文字符,也易于理解。
原文链接:moviepy-cn
原文效果:
原文中保留的代码:
rotMatrix = lambda a: np.array( [[np.cos(a),np.sin(a)], [-np.sin(a),np.cos(a)]] )
def vortex(screenpos, i, nletters): d = lambda t: 1.0 / (0.3 + t ** 8) # dampinga = i * np.pi / nletters # angle of the movementv = rotMatrix(a).dot([-1, 0])if i % 2: v[1] = -v[1]return lambda t: screenpos + 400 * d(t) * rotMatrix(0.5 * d(t) * a).dot(v)def cascade(screenpos, i, nletters): v = np.array([0, -1])d = lambda t: 1 if t < 0 else abs(np.sinc(t) / (1 + t ** 4))return lambda t: screenpos + v * 400 * d(t - 0.15 * i)def arrive(screenpos, i, nletters): v = np.array([-1, 0])d = lambda t: max(0, 3 - 3 * t)return lambda t: screenpos - 400 * v * d(t - 0.2 * i)def vortexout(screenpos, i, nletters): d = lambda t: max(0, t) # dampinga = i * np.pi / nletters # angle of the movementv = rotMatrix(a).dot([-1, 0])if i % 2: v[1] = -v[1]return lambda t: screenpos + 400 * d(t - 0.1 * i) * rotMatrix(-0.2 * d(t) * a).dot(v)
上边这段代码,是产生文字特效的函数,返回随时间变化字符所在的位置,我们拷贝过来调用即可。
原文中使用findObjects()方法,返回由单个英文字符组成的图片剪辑列表。但当使用中文字符时,可能返回不完整的中文字符,例如对于"中文特效"四个字符,效果如下:
为了能够支持中文,重建文字动画函数:
import moviepy.editor as mpe
def txtanimation(screensize,lettersize,text,func,offsetx,offsety):screenw=screensize[0] #屏幕宽度screenh=screensize[1] #屏幕高度letterw=lettersize[0] #单个字符宽度letterh=lettersize[1] #单个字符高度letternum=len(text) #字符数量letteronex=(screenw-letterw*letternum)/2+offsetx #首个字符在屏幕中的x坐标letteroney=(screenh-letterh)/2+offsety #首个字符在屏幕中的y坐标tclips = [] #剪辑列表for i in range(letternum):tclip = mpe.TextClip(text[i], color='white', font='KaiTi', kerning=5, fontsize=70, size=lettersize) #创建单个字符文本剪辑tclip = tclip.set_pos((letteronex + i * letterw, letteroney)) # 设置单个字符文本剪辑在屏幕中的初始位置tclip = tclip.set_pos(func(tclip.pos(0), i, letternum)) # 调用文字特效函数tclips.append(tclip) #添加到剪辑列表return tclips
上边 的函数中我们把每个字符创建成独立的文本剪辑,并按顺序排列,放置于屏幕居中的位置,然后调用文字特效函数,产生文字动画效果。
接下来就是调用上边的文字动画函数,输出我们的视频效果:
screensize=(640,480)
lettersize=(80,80)
text=['树','大','好','乘','凉']
clip1=mpe.CompositeVideoClip(txtanimation(screensize,lettersize,text,cascade,0,-100),size=screensize).subclip(0,10)
clip2=mpe.CompositeVideoClip(txtanimation(screensize,lettersize,text,vortexout,0,-100),size=screensize).subclip(0,5)
iclip=mpe.ImageClip('.\\pic\\tree.jpg').set_duration(10)
clip=mpe.CompositeVideoClip([iclip,clip1.fadeout(2),clip2.set_start(10).fadein(1)])
clip.write_gif('.\\pic\\letter.gif',fps=5)
效果如下:
玉不琢、不成器,人不学、不知义!
这篇关于moviepy中文字符特效的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!