Python实现文字特效的方法
不懂Python实现文字特效的方法?其实想解决这个问题也不难,下面让小编带着大家一起学习怎么去解决,希望大家阅读完这篇文章后大所收获。
基本结构
总结文字特效的特点是,每个文字独立运动,都符合同一个运动规律,但每个文字之间保持一个固定的时间差。
每个字的运动可以分成三个部分,字体大小的变化、文字位置的变化、文字颜色(透明度)的变化。
#把每个文字与它的三个运动结合为一个基本单位defnewTextMotion(char,posFunc,sizeFunc,colorFunc):tm={}tm['char']=chartm['posFunc']=posFunctm['sizeFunc']=sizeFunctm['colorFunc']=colorFuncreturntm
文字动效的展示
在任意一个时间点上,获得文字的显示效果。
#在指定的时间,计算文字的位置、大小、颜色等defshowText(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]//2ty=pos[1]-textSize[1]//2draw.text(xy=(tx,ty),text=char,fill=color,font=font)
针对一组文字,形成一个列表,获取起每个时间点的显示图,作为一帧
defgetTextFrame(tmList,time):textImg=Image.new('RGBA',(1280,720))fortmintmList:showText(textImg,tm,time)returntextImg
具体文字运动规律
下面看看这两种特效的具体运动规律。乍一看比较复杂,但拆分为三个运动后,其实每种都比较简单。以此为模块,读者可以自行制作更多的文字特效。
#文字缩小defmakeTextShrink(char,toSize,toPos,toColor,offset,dur):defcolorFunc(time):iftime<offset:return(0,0,0,0)iftime>offset+dur:returntoColorreturntoColor[:-1]+(50+round((time-offset)/dur*200),)defsizeFunc(time):iftime<offset:returntoSize*8iftime>offset+dur:returntoSizereturntoSize*8-round((time-offset)/dur*toSize*7.5)defposFunc(time):iftime<offset:return(0,0)iftime>offset+dur:returntoPos#return(toPos[0],round((time-offset)/dur*toPos[1]))returntoPosreturnnewTextMotion(char,posFunc,sizeFunc,colorFunc)#抛物线降落(有一个回弹效果)defmakeTextParaDrop(char,toSize,toPos,toColor,offset,dur):defcolorFunc(time):iftime<offset:return(0,0,0,0)iftime>offset+dur:returntoColorreturntoColor[:-1]+(50+round((time-offset)/dur*200),)defsizeFunc(time):iftime<offset:returntoSizeiftime>offset+dur:returntoSizereturntoSizedefposFunc(time):iftime<offset:return(toPos[0],0)iftime>offset+dur:returntoPosr=0.75dur2=dura=toPos[1]/(dur2*dur2*(1-2*r))b=-2*a*dur2*rx=(time-offset)return(toPos[0],round(a*x*x+b*x))#print(toPos)returnnewTextMotion(char,posFunc,sizeFunc,colorFunc)
整体设置与运行
对于一行文字,每个增加特效,并依次给予一个延时。
#一行文字,给定所有参数,配置运动函数与延时defgetMotionList(text,fontSize,fontColor,startPos,fromTime,dur,func):tmList=[]inter=round(dur/len(text))foriinrange(len(text)):char=text[i]pos=(startPos[0]+i*fontSize+10,startPos[1])color=fontColor#tm=makeTextDropMotion(char,fontSize,pos,color,150*i)tm=func(char,fontSize,pos,color,fromTime+inter*i,dur)tmList.append(tm)returntmList
这里,将不同的文字特效函数作为参数传入即可,有比较好的扩展性。
最后是一个展示函数,用了imageio来制作gif图。这里注意两个地方,第一是展示时间应当是单文字运动时间的两倍。为了确保动感,当第一个文字到位时,最后一个文字恰好启动,所以时间是两倍的关系。
第二是制作GIF的延时应当与计算用的延时一致,这里都是50毫秒(20fps)。
defshowTextDrop(text,startPos,func):fontSize=50color=(255,255,0,255)tmList=getMotionList(text,fontSize,color,startPos,0,1000,func)frames=[]outfilename='temp.gif'foriinrange(0,2000,50):print(i)img=Image.new('RGB',(640,360))#img=Image.open('back.png').resize((640,360),Image.ANTIALIAS)#img=img.convert("RGB")textImg=getTextFrame(tmList,i)r,g,b,a=textImg.split()img.paste(textImg,(0,0),mask=a)str1='tempAA.png'img.save(str1)im=imageio.imread(str1)frames.append(im)imageio.mimsave(outfilename,frames,'GIF',duration=0.05)if__name__=='__main__':#showTextDrop('淡妆浓抹总相宜',(150,200),makeTextParaDrop)showTextDrop('淡妆浓抹总相宜',(150,200),makeTextDropMotion)
两张效果图
感谢你能够认真阅读完这篇文章,希望小编分享Python实现文字特效的方法内容对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,遇到问题就找亿速云,详细的解决方法等着你来学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。