不懂Python實現(xiàn)文字特效的方法?其實想解決這個問題也不難,下面讓小編帶著大家一起學(xué)習(xí)怎么去解決,希望大家閱讀完這篇文章后大所收獲。
成都創(chuàng)新互聯(lián)專注于北鎮(zhèn)企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城建設(shè)。北鎮(zhèn)網(wǎng)站建設(shè)公司,為北鎮(zhèn)等地區(qū)提供建站服務(wù)。全流程按需求定制設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
基本結(jié)構(gòu)
總結(jié)文字特效的特點是,每個文字獨立運動,都符合同一個運動規(guī)律,但每個文字之間保持一個固定的時間差。
每個字的運動可以分成三個部分,字體大小的變化、文字位置的變化、文字顏色(透明度)的變化。
# 把每個文字與它的三個運動結(jié)合為一個基本單位 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
具體文字運動規(guī)律
下面看看這兩種特效的具體運動規(guī)律。乍一看比較復(fù)雜,但拆分為三個運動后,其實每種都比較簡單。以此為模塊,讀者可以自行制作更多的文字特效。
# 文字縮小 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) def posFunc(time): if time< offset: return (0,0) if time> offset+ dur: return toPos # return (toPos[0], round((time-offset)/dur*toPos[1])) return toPos return newTextMotion(char, posFunc, sizeFunc, colorFunc) # 拋物線降落(有一個回彈效果) def makeTextParaDrop(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 if time> offset+ dur: return toSize return toSize def posFunc(time): if time< offset: return (toPos[0], 0) if time> offset+ dur: return toPos 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) return newTextMotion(char, posFunc, sizeFunc, colorFunc)
整體設(shè)置與運行
對于一行文字,每個增加特效,并依次給予一個延時。
# 一行文字,給定所有參數(shù),配置運動函數(shù)與延時 def getMotionList(text, fontSize, fontColor, startPos, fromTime, dur, func): tmList=[] inter= round(dur/ len(text)) for i in range(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) return tmList
這里,將不同的文字特效函數(shù)作為參數(shù)傳入即可,有比較好的擴展性。
最后是一個展示函數(shù),用了imageio來制作gif圖。這里注意兩個地方,第一是展示時間應(yīng)當(dāng)是單文字運動時間的兩倍。為了確保動感,當(dāng)?shù)谝粋€文字到位時,最后一個文字恰好啟動,所以時間是兩倍的關(guān)系。
第二是制作GIF的延時應(yīng)當(dāng)與計算用的延時一致,這里都是50毫秒(20fps)。
def showTextDrop(text, startPos, func): fontSize= 50 color=(255, 255, 0, 255) tmList= getMotionList(text, fontSize, color, startPos, 0, 1000, func) frames=[] outfilename='temp.gif' for i in range(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)
兩張效果圖
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享Python實現(xiàn)文字特效的方法內(nèi)容對大家有幫助,同時也希望大家多多支持創(chuàng)新互聯(lián),關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,遇到問題就找創(chuàng)新互聯(lián),詳細(xì)的解決方法等著你來學(xué)習(xí)!