Python特效,python图片处理酷炫效果

  Python特效,python图片处理酷炫效果

  先上两张效果图

  基本结构

  总结人物特效的特点是每个人物独立运动,符合同一运动规律,但每个人物保持固定的时间差。

  每个字的移动可以分为三个部分:字体大小的变化,文字位置的变化,文字颜色(透明度)的变化。

  #将每个单词及其三个动作组合成一个基本单位

  defnewTextMotion(char,posFunc,sizeFunc,colorFunc):

  tm={}

  tm[char]=char

  tm[posFunc]=posFunc

  tm[sizeFunc]=sizeFunc

  tm[颜色函数]=颜色函数

  return TM文字动效的展示

  在任一时间点,获得字符的显示效果。

  #在指定的时间,计算位置、大小、颜色等。文本的

  defshowText(img,textMotion,time):

  char=textMotion[char]

  pos=textMotion[posFunc](时间)

  size=textMotion[sizeFunc](时间)

  color=textMotion[colorFunc](时间)

  font=image font . truetype(font name,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

  画吧。text (xy=(tx,ty),text=char,fill=color,font=font)形成一组字符的列表,获取每个时间点的显示图像作为一帧。

  defgetTextFrame(tmList,time):

  textImg=Image.new(RGBA ,(1280,720))

  fortmintmList:

  showText(textImg,tm,time)

  return text具体文字运动规律

  我们来看看这两个特效的具体移动规律。乍一看很复杂,但拆分成三项运动后,每一项其实都更简单了。以此为模块,读者可以自己制作更多的文字特效。

  #文本缩减

  defmakeTextShrink(char,toSize,toPos,toColor,off

  et,dur):

  defcolorFunc(time):

  iftime<offset:

  return(0,0,0,0)

  iftime>offset+dur:

  returntoColor

  returntoColor[:-1]+(50+round((time-offset)/dur*200),)

  defsizeFunc(time):

  iftime<offset:

  returntoSize*8

  iftime>offset+dur:

  returntoSize

  returntoSize*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]))

  returntoPos

  returnnewTextMotion(char,posFunc,sizeFunc,colorFunc)

  #抛物线降落(有一个回弹效果)

  defmakeTextParaDrop(char,toSize,toPos,toColor,offset,dur):

  defcolorFunc(time):

  iftime<offset:

  return(0,0,0,0)

  iftime>offset+dur:

  returntoColor

  returntoColor[:-1]+(50+round((time-offset)/dur*200),)

  defsizeFunc(time):

  iftime<offset:

  returntoSize

  iftime>offset+dur:

  returntoSize

  returntoSize

  defposFunc(time):

  iftime<offset:

  return(toPos[0],0)

  iftime>offset+dur:

  returntoPos

  r=0.75

  dur2=dur

  a=toPos[1]/(dur2*dur2*(1-2*r))

  b=-2*a*dur2*r

  x=(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=50

  color=(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知识,请关注Python视频教程!!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: