精华内容
下载资源
问答
  • python制作文字特效

    千次阅读 2020-06-05 06:42:28
    用pyton制作文字特效 先上两张效果图 基本结构 总结文字特效的特点是,每个文字独立运动,都符合同一个运动规律,但每个文字之间保持一个固定的时间差。每个字的运动可以分成三个部分,字体大小的变化、文字位置的...

    用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)
        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)
    
    

    整体设置与运行

    对于一行文字,每个增加特效,并依次给予一个延时。

    # 一行文字,给定所有参数,配置运动函数与延时
    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
        
    

    这里,将不同的文字特效函数作为参数传入即可,有比较好的扩展性。

    最后是一个展示函数,用了imageio来制作gif图。这里注意两个地方,第一是展示时间应当是单文字运动时间的两倍。为了确保动感,当第一个文字到位时,最后一个文字恰好启动,所以时间是两倍的关系。
    第二是制作GIF的延时应当与计算用的延时一致,这里都是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)
    

    完整源代码

    贴一下完整的代码。

    
    from PIL import Image, ImageDraw, ImageFont
    import imageio
    
    fontName= r'.\happy1.ttf'
    
    # 把每个文字与它的三个运动结合为一个基本单位
    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 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)
    
    def getTextFrame(tmList, time):
        textImg= Image.new('RGBA', (1280, 720))
        for tm in tmList:
            showText(textImg, tm, time) 
        return textImg
    
    # 一行文字,给定所有参数,配置运动函数与延时
    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
    
    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)
        # writeGif('temp.gif', frames, duration=0.1, subRectangles=False) #
        imageio.mimsave(outfilename, frames, 'GIF', duration=0.05) # 生成方式也差不
    
    if __name__=='__main__':
        # showTextDrop('淡妆浓抹总相宜', (150,200), makeTextParaDrop)
        showTextDrop('淡妆浓抹总相宜', (150,200), makeTextDropMotion)
    
    
    
    展开全文
  • python图片写中文 gif 制作 bkimg="a.jpg" fnm="res.gif" ffont="/System/Library/Fonts/STHeiti Medium.ttc" #.ttf images=[] com="comm 文本-_-" com_c=(0,0,0) arr_txt=["文本1", com, com, "文本1",com, com, ...

    颜色参考
    python图片写中文
    gif 制作

    bkimg="a.jpg"
    fnm="res.gif"
    ffont="/System/Library/Fonts/STHeiti Medium.ttc" #.ttf
    images=[]
    com="comm 文本-_-"
    com_c=(0,0,0)
    arr_txt=["文本1", com, com, "文本1",com, com,
            "文本1",com, com, "文本1",com, com]
    arr_color=[(0,128,128), ( 128,0,128 ), (0,0,255),(255,0,255)]
    pos=(120,170)
    for i, txt in enumerate(arr_txt):
        if i%3==0:
            color=arr_color[i//3]
        else: color = com_c
        #pilimg = Image.fromarray(img)
        pilimg = Image.open(bkimg)
        draw = ImageDraw.Draw(pilimg)
        # 参数1:字体文件路径,参数2:字体大小
        font = ImageFont.truetype(ffont, 56, encoding="utf-8")
        draw.text(pos, txt, color, font=font)
        images.append(pilimg)
    
    images[0].save(fnm,save_all=True,loop=0,append_images=images[1:],duration=550)
    
    展开全文
  • python一键生成动画(上)

    千次阅读 2020-05-17 09:24:07
    这种动画类型,我觉得可以叫做配音配画的小说。 微型小说:多余的话 第一篇文章,介绍一下设计过程的原理和流程,下一篇文章讲细节。 整个生成过程的起点包括两个部分:小说文字和素材。当然这种小说最好是对话...

    简介

    这种动画类型,我觉得可以叫做配音配画的小说。

    微型小说:多余的话

    第一篇文章,介绍一下设计过程的原理和流程,下一篇文章讲细节。

    整个生成过程的起点包括两个部分:小说文字和素材。当然这种小说最好是对话比较多的类型,才能体现出配音的意义。如果是景物描写、心理描写比较多的,用这种形式就不理想。

    实现过程,采用多步实现,每一步形成一个稳定的中间结果。这样做的好处是每步实现过程相对独立,便于局部改善。同时一个作品的形成过程中进行反复调试是难免的,针对中间结果进行调试可以节约时间。

    基本流程

    第零步:剧本改造,加入标注。根据约定,用#表示控制内容。

    • #read  表示旁白
    • #talk:表示角色朗读
    • #def:系列表示一些预定义,包含角色音色、声调、图片、位置等
    • #角色名:表示角色的移动和表情
    • #back:表现切换背景

    等等

    以及准备素材,包括背景、人物造型、物品图片,并做背景消除。

    这一步的工作,虽然可以有一些辅助,但相比较来说,以手工为主。

    下面的各步,都是程序一键实现。

    第二步:从剧本的标注中提取待朗读的内容,生成语音

    我们直接采用百度的声音接口把文字转成MP3,效果见视频,感觉还是可以接受的。

    分段朗读,把每个MP3文件统一命名保存

    此外把朗读的文字内容保存为独立文件,每个MP3文件的时间长度,也保存起来。用于作为时间线的参考。

    第三步:从剧本的标志中提取背景、角色动作信息,形成动画操作脚本

    这个文件以机读为主,所以直接使用了python的列表对象转文本保存

    第四步:根据动画操作脚本,绘制所有的关键帧

    这里的关键帧,和一般的概念有所不同。所有发生变化的图片,在这里都叫做关键帧。

    也就是说,这里将绘制所有发生变化的图片。

    每个角色一个单独的层进行绘制,便于叠加显示。

    第五步:根据关键帧,形成整个动画的所有帧

    在每帧画面中,根据时间的流动,从关键帧资料中获取各背景、角色、物品、文字、遮罩等各层,进行叠加。

    形成所有的帧,独立保存。

    第六步:生成多段独立的动画

    第七步:音频视频融合

    音频和动画难以完全同步,所以每段音频和动画必须独立匹配,然后再连接。

    第八步:生成字幕文件并与整体视频融入

    第三方库

    其中用到比较多的FFMPEG处理,所有必须安装好ffmepg

    用到百度TTS,应当安装好百度相应的库

    另外,还用了moviepy来测量视频的长度;pydub来测量音频的长度;PIL来进行图片操作。

    第三方的库,基本上就是这些。

    剧本改造参考

    剧本如下:

    #read
    #def:reader=4,6,5
    #def:boy=106,5,5,boy00.png
    #def:ticket=111,5,7,ticket00.png
    #def:man=3,4,2,man00.png
    #def:girl=110,6,6,girl00.png
    #def:lady=103,5,3,lady00.png
    #def:author=106,7,6,author00.png
    #defobj:bag=bag00.png
    #defobj:map=map00.png
    #defobj:book=book00.png
    #defpos:leftpos=200
    #defpos:leftpos2=-50
    #defpos:rightpos=200
    #defpos:rightpos2=-50
    #defpos:bagpos=(40,400)
    #defpos:mappos=(220,270)
    #defpos:bookpos1=(90,160)
    #defpos:bookpos2=(300,-150)
    #defpos:center=(640,430)
    #back:车站.png
    #author:leftin,100
    。。。欢迎观看。。微型小说《多余的话》。。。。
    那天我坐公交车去找朋友,
    
    #back:公交车内.png
    车上人不多,但也没有空位子,
    #author:hide
    有几个人还站着,吊在拉手上晃来晃去。
    #boy:leftin
    一个年轻人,干干瘦瘦的,戴个眼镜,身旁有几个大包,
    #bag:show,bagpos
    一看就是刚从外地来的。他靠在售票员旁边,
    #map:show,mappos,0.8
    手拿着一个地图在认真研究着,眼不时露出茫然的神情,估计是有点儿迷路了。
    
    他犹豫了半天,很不好意思地问售票员:
    
    #talk:boy
    「去颐和园应该在哪儿下车啊?」
    
    #read
    #ticket:rightin
    售票员是个短头发的小姑娘,
    #ticket:action,blink
    正剔着指甲缝呢。
    #ticket:action,blink
    她抬头看了一眼外地小伙子说:
    #ticket:action,blink
    #talk:ticket
    「你坐错方向了,应该到对面往回坐。」
    
    #read
    
    要说这些话也没什么错了,大不了小伙子下一站下车到马路对面坐回去吧。
    
    但是售票员可没说完,她说了那多余的最后一句话:
    #talk:ticket
    #ticket:action,blink
    「拿着地图都看不明白,还看个什么劲儿啊!」
    
    #read
    #ticket:action,blink
    售票员姑娘眼皮都不抬。
    
    #ticket:rightout
    外地小伙儿可是个有涵养的人,
    #map:hide
    他嘿嘿笑了一笑,把地图收起来,准备下一站下车换车去。
    
    #man:rightin
    旁边有个大爷可听不下去了,他对外地小伙子说:
    
    #talk:man
    「你不用往回坐,再往前坐四站换904也能到。」
    
    #read
    #man:action,blink
    是他说到这儿也就完了那还真不错,
    #man:action,blink
    既帮助了别人,
    #man:action,blink
    也挽回北京人的形象。
    
    #man:action,blink
    可大爷哪儿能就这么打住呢?
    #man:action,blink
    他一定要把那多余的最后一句话说完:
    
    #talk:man,action
    「现在的年轻人哪,没一个有教养的!」
    
    #read
    #bag:hide
    #boy:leftout
    我心想,大爷这话真是多余。车上年轻人好多呢,打击面太大了吧。
    
    #girl:leftin
    可不,站在大爷旁边的一位小姐就忍不住了。。
    
    #talk:girl
    「大爷,不能说年轻人都没教养吧。
    #girl:action,blink
    没教养的毕竟是少数嘛,
    您这么一说我们都成什么了!」
    
    #read
    这位小姐穿得挺时髦,
    #girl:action,blink
    两细带子吊个小背心,脸上化着鲜艳的浓妆,
    #girl:action,blink
    头发染成火红色。
    #man:action,blink
    可您瞧人这话,
    #girl:action,blink
    不像没教养的人吧,跟大爷还『您』啊『您』的。
    
    #girl:action,blink
    谁叫她也忍不住非要说那多余的最后一句话呢!
    
    #talk:girl,action
    「就像您这样上了年纪看着挺慈祥的,
    一肚子坏水儿的可多了呢!」
    
    #read
    #man:rightout
    没有人出来批评一下时髦的小姐是不正常的。
    #girl:action,blink
    
    #lady:rightin
    可不,一个中年的大姐说了:
    
    #talk:lady
    #girl:action,blink
    「你这个女孩子怎么能这么跟老人讲话呢?
    #lady:action,blink
    要有点儿礼貌嘛,你对你父母也这么说吗?」
    
    #read
    您瞧大姐批评得多好!
    #lady:action,blink
    把女孩子爹妈一抬出来,
    #girl:action,blink
    女孩子立刻就不吭声了。
    #lady:action,blink
    要说这会儿就这么结了也就算了,
    #girl:action,blink
    大家说到这儿也就完了,
    大家该干嘛干嘛去。
    #lady:action,blink
    可不要忘了,大姐的「多余的最后一句话」还没说呢。
    
    #talk:lady
    「瞧你那样,估计你父母也管不了你。
    #lady:action,blink
    打扮得跟“鸡”似的!」
    
    
    #read
    #girl:leftout
    后面的事大家就可想而知了。
    #lady:rightout
    简单地说,出人命的可能都有。
    
    这么吵着闹着,车可就到站了。
    #ticket:rightin
    
    车门一开,售票员小姑娘说:
    #ticket:action,02
    #talk:ticket
    「都别吵了,该下的赶快下车吧。
    别把自己正事儿给耽误了。」
    
    #read
    当然,她没忘了把最后一句多余的话给说出来:
    #ticket:action,00
    
    #talk:ticket
    「要吵统统都给我下车吵去。
    不下去我车可不走了啊!烦不烦啊!」
    
    #read
    烦不烦?烦!
    #ticket:action,blink
    不仅她烦,所有乘客都烦了!
    整个车厢这可叫炸了窝了。
    #man:leftin,leftpos
    骂售票员的,
    骂外地小伙子的,
    #girl:rightin,rightpos2
    骂时髦小姐的,
    骂中年大姐的,
    #lady:leftin,leftpos2
    骂天气的,
    骂自个儿孩子的,
    真是人声鼎沸,甭提多热闹了!
    #boy:centerin
    
    那个外地小伙子一直没有说话,估计他受不了了,他大叫一声:
    
    #talk:boy
    「大家都别吵了!都是我的错!
    我自个儿没看好地图,让大家跟着都生一肚子气!
    大家就算给我面子,都别吵了行吗?」
    
    #read
    #man:hide
    听到他这么说,
    #lady:hide
    当然车上的人都不好意思再吵,
    #girl:hide
    声音很快平息下来,
    #ticket:hide
    少数人轻声嘀咕了两句也就不说话了。
    
    但你们不要忘了,外地小伙子的『多余的最后一句』还没说呢。
    
    #talk:boy
    「早知道北京人都是这么一群不讲理的王八蛋,
    我还不如不来呢!」
    
    #ticket:show,700
    #man:show,leftpos
    #girl:show,leftpos2
    #lady:show,900
    
    #read
    。。。。。。
    #back:公交车内.png
    想知道事情最后的结果吗?
    #boy:hide
    #man:hide
    #lady:hide
    #girl:hide
    #ticket:hide
    
    我那天的事情没有办成,
    #author:centerin
    
    大伙儿先被带到公安局录了口供,然后到医院外科把头上的伤给处理了一下,
    #ticket:leftin,leftpos2
    我头上的伤是在混战中被售票员小姑娘用票匣子给砸的。
    #ticket:action,blink
    
    你们可别认为我参与了他们打架,
    #ticket:action,blink
    我是去劝架来着。我呼吁他们都冷静一点儿,有话好好说,
    #ticket:action,blink
    没什么大事儿,没什么必要非打个头破血流。
    
    我多余的最后一句话是这么说的:
    #talk:author
    #effect:circle
    #book:show,bookpos1
    #author:action,01
    不就是售票员说话不得体吗?
    #book:rotmove,bookpos2
    你们就当她是个傻子,
    #author:action,02
    和她计较什么呢?!
    #text:The End,70,center
    #ticket:action,blink
    #end:1
    

     

    展开全文
  • 今天小编就为大家分享一篇关于Python制作动态字符图的实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 我用Python导出了两万行字符,做成了动画...

    万次阅读 多人点赞 2020-06-03 14:27:40
    我用Python导出了两万行字符,做成了动画... 如果感觉视频做的还不错,求点个赞鼓励一下~ 视频中的字符动画的文档和代码我这这里贴一下,大家想要做类似视频的话可以参考~~ 1、前面的字符效果 import os

    前几天看了B站Up主何同学的视频,有了这个导出字符文档做成视频想法,比我想象中要费时间,卡点实在是太难了…

    但是一旦脑子里有个想法,不实现出来浑身难受…

    这是视频 ↓↓↓

    我用Python导出了两万行字符,做成了动画...

    B站主页:https://space.bilibili.com/279911711

    如果感觉视频做的还不错,求点个赞鼓励一下~

    视频中的字符动画的文档和代码我这这里贴一下,大家想要做类似视频的话可以参考~~

    1、前面的字符效果

    import os #文件模块
    import random
    
    # "♡"
    snake1,snake2,snake3,snake4,snake5,snake6 = 0,0,0,0,0,0
    data = ""
    blank = 600
    blank2 = 600
    blank3 = 800
    default_texts = ["o","■","□"]
    repead = 6
    repead2 = 5
    repead3 = 8
    speed = 5
    food = "●●●●●"
    
    # 效果1
    while snake1 < 4:
    	index = 0
    	while index <= blank:
    		# print(index)
    		index += speed
    		text = "<p style='font-size:1.0pt;color:red;font-family:Helvetica;mso-bidi-font-family:宋体'>"+'&nbsp;'*index + "<span style='font-size:40.0pt;'>" + default_texts[0]*repead + '</span>' + '</p>'
    		data += text + "\n" 
    		while index+speed >= blank:
    			index += (speed//2)
    			if index+(speed//2) > blank:
    				# print(index)
    				for i in [1,2,3,4,5]:
    					index += 1
    					text = "<p style='font-size:1.0pt;color:red;font-family:Helvetica;mso-bidi-font-family:宋体'>"+'&nbsp;'*index + "<span style='font-size:40.0pt;'>" + default_texts[0]*(repead+i) + '</span>' + '</p>'
    					data += text + "\n" 
    			else:
    				text = "<p style='font-size:1.0pt;color:red;font-family:Helvetica;mso-bidi-font-family:宋体'>"+'&nbsp;'*index + "<span style='font-size:40.0pt;'>" + default_texts[0]*repead + '</span>' + '</p>'
    				data += text + "\n" 
    			if index > blank:
    				food_data = "<p style='font-size:1.0pt;color:red;font-family:Helvetica;mso-bidi-font-family:宋体'>"+'&nbsp;'*index + "<span style='font-size:40.0pt;'>" + default_texts[0]*(repead//2) + "<span style='color:orange;'>" + food + "</span>"  + default_texts[0]*(repead//2) + "</span></p>"
    				for i in [1,2,3,4,5]:
    					data += food_data + "\n" 
    				break
    		
    	while index >= 0:
    		# print("index",index)
    		while index+(speed//2) > blank:
    			# print("index22",index)
    			index -= (speed//2)
    			for i in [5,4,3,2,1]:
    				index -= 1
    				text = "<p style='font-size:1.0pt;color:red;font-family:Helvetica;mso-bidi-font-family:宋体'>"+'&nbsp;'*index + "<span style='font-size:40.0pt;'>" + default_texts[0]*(repead+i) + '</span>' + '</p>'
    				# print(text)
    				data += text + "\n" 
    		if index < 0:
    			break
    		index -= speed
    		text = "<p style='font-size:1.0pt;color:red;font-family:Helvetica;mso-bidi-font-family:宋体'>"+'&nbsp;'*index + "<span style='font-size:40.0pt;'>" + default_texts[0]*repead + '</span>' + '</p>'
    		data += text + "\n" 
    	snake1 += 1
    	# print("data",data)
    
    # 效果2
    while snake2 < 50:
    	index = 0
    	if snake2 % 2 == 1:
    		time_blank = random.randint(0,(blank2//2))
    	else:
    		time_blank = random.randint((blank2//2),blank2)
    	while index < 6:
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+'&nbsp;'*time_blank + "<span style='font-size:20.0pt;'>" + default_texts[1]*repead2 + '</span>' + '</p>'
    		data += text + "\n" 
    		index +=1
    
    	index = 0
    	while index < 3:
    		data += "<p>&nbsp;</p>" + "\n" 
    		index +=1
    	snake2+=1
    
    # 效果3
    while snake3 < 50:
    	index = 0
    
    	default_text = random.choice(default_texts[1:])
    	if snake3 % 2 == 1:
    		time_blank = random.randint(0,(blank2//2))
    	else:
    		time_blank = random.randint((blank2//2),blank2)
    	while index < 6:
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+'&nbsp;'*time_blank + "<span style='font-size:20.0pt;'>" + default_text*repead2 + '</span>' + '</p>'
    		data += text + "\n" 
    		index +=1
    
    	index = 0
    	while index < 3:
    		data += "<p>&nbsp;</p>" + "\n" 
    		index +=1
    	snake3+=1
    
    
    # 效果4
    color_index = 1
    while snake4 < 15:
    	index = 0
    	default_text = default_texts[0]
    	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    	while index <= blank3//repead3:
    		time_text = ""
    		for i in range(1, (repead3+1)):
    			time_text +=  "<span style='font-size:20.0pt;'>" + default_text + '</span>' + '&nbsp;'*index
    		# print(time_text)
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体;'>"+ time_text +"</p>"
    		div_text += text + "\n"
    		index +=1
    	color_index += 1
    	print(color_index)
    	data = data + div_text + "</div>"
    
    	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    	while index >= 0:
    		time_text = ""
    		for i in range(1, (repead3+1)):
    			time_text +=  "<span style='font-size:20.0pt;'>" + default_text + '</span>' + '&nbsp;'*index
    		# print(time_text)
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体;'>"+time_text +"</p>"
    		div_text += text + "\n"
    		index -=1
    	color_index += 1
    	print(color_index)
    	data = data + div_text + "</div>"
    	snake4+=1
    
    # # 效果5
    # while snake5 < 20:
    # 	index = 0
    # 	default_text = default_texts[0]
    # 	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    # 	while index <= blank3//repead3:
    # 		time_text = ""
    # 		for i in range(1, (repead3+1)):
    # 			time_text +=  "<span style='font-size:20.0pt;'>" + default_text + '</span>' + '&nbsp;'*index
    # 		# print(time_text)
    # 		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+ time_text +"</p>"
    # 		div_text += text + "\n"
    # 		index +=1
    # 	color_index += 1
    # 	print(color_index)
    # 	data += div_text + "</div>"
    		
    
    # 	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    # 	while index >= 0:
    # 		time_text = ""
    # 		for i in range(1, (repead3+1)):
    # 			time_text = "<span style='font-size:20.0pt;'>" + default_text + '</span>' +'&nbsp;'*index + time_text
    # 		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+ time_text +"</p>"
    # 		div_text += text + "\n"
    # 		index -=1
    # 	color_index += 1
    # 	print(color_index)
    # 	data += div_text + "</div>"
    # 	snake5+=1
    
    # 效果6
    while snake6 < 7:
    	index = 0
    	default_text = default_texts[0]
    	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    	while index <= blank3//repead3:
    		time_text = ""
    		for i in range(1, (repead3+1)):
    			time_text +=  "<span style='font-size:20.0pt;'>" + default_text + '</span>' + '&nbsp;'*index
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+ time_text +"</p>"
    		div_text += text + "\n"
    		index +=1
    	color_index += 1
    	print(color_index)
    	data += div_text + "</div>"
    
    	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    	while index >= 0:
    		time_text = ""
    		index_length = 0
    		for i in range(1, (repead3+1)):
    			time_text = "<span style='font-size:20.0pt;'>" + default_text + '</span>' +'&nbsp;'*index + time_text
    			index_length += index
    		time_index = blank3 - index_length
    		time_text = '&nbsp;'*time_index + time_text
    		
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+ time_text +"</p>"
    		div_text += text + "\n"
    		index -=1
    	color_index += 1
    	print(color_index)
    	data += div_text + "</div>"
    
    	index = 0
    	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    	while index <= blank3//repead3:
    		time_text = ""
    		index_length = blank3
    		for i in range(1, (repead3+1)):
    			time_text +=  "<span style='font-size:20.0pt;'>" + default_text + '</span>' + '&nbsp;'*index
    			index_length -= index
    		# print("index_length",index_length)
    		time_text = '&nbsp;'*index_length + time_text
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+ time_text +"</p>"
    		div_text += text + "\n"
    		index +=1
    	color_index += 1
    	print(color_index)
    	data += div_text + "</div>"
    
    	index = blank3//repead3
    	div_text = "<div class='simple-linear" + str(color_index) + "'>"
    	while index >= 0:
    		time_text = ""
    		# index_length = 0
    		for i in range(1, (repead3+1)):
    			time_text = "<span style='font-size:20.0pt;'>" + default_text + '</span>' +'&nbsp;'*index + time_text
    		text = "<p style='font-size:1.0pt;font-family:Helvetica;mso-bidi-font-family:宋体';>"+ time_text +"</p>"
    		div_text += text + "\n"
    		index -=1
    	color_index += 1
    	print(color_index)
    	data += div_text + "</div>"
    	snake6+=1
    
    
    # 效果7
    # http://www.divcss5.com/peise/
    style = '''<style>* {margin:0;padding:0;}
    .simple-linear1{ background: linear-gradient(#FFFFFF,#FFCC99);}
    .simple-linear2{ background: linear-gradient(#FFCC99,#FFFF99);}
    .simple-linear3{ background: linear-gradient(#FFFF99,#99CC99);}
    .simple-linear4{ background: linear-gradient(#99CC99,#FFCC99);}
    .simple-linear5{ background: linear-gradient(#FFCC99,#CCFF99);}
    .simple-linear6{ background: linear-gradient(#CCFF99,#CCCCCC);}
    .simple-linear7{ background: linear-gradient(#CCCCCC,#FFCC99);}
    .simple-linear8{ background: linear-gradient(#FFCC99,#FFFFCC);}
    .simple-linear9{ background: linear-gradient(#FFFFCC,#99CCFF);}
    .simple-linear10{ background: linear-gradient(#99CCFF,#FF9966);}
    .simple-linear11{ background: linear-gradient(#FF9966,#FFFFCC);}
    .simple-linear12{ background: linear-gradient(#FFFFCC,#99CC99);}
    .simple-linear13{ background: linear-gradient(#99CC99,#FF9900);}
    .simple-linear14{ background: linear-gradient(#FF9900,#FFFFCC);}
    .simple-linear15{ background: linear-gradient(#FFFFCC,#FF6666);}
    .simple-linear16{ background: linear-gradient(#FF6666,#CCCC33);}
    .simple-linear17{ background: linear-gradient(#CCCC33,#FFFF99);}
    .simple-linear18{ background: linear-gradient(#FFFF99,#CC9933);}
    .simple-linear19{ background: linear-gradient(#CC9933,#996600);}
    .simple-linear20{ background: linear-gradient(#996600,#FFCC33);}
    .simple-linear21{ background: linear-gradient(#FFCC33,#009966);}
    .simple-linear22{ background: linear-gradient(#009966,#FFFFCC);}
    .simple-linear23{ background: linear-gradient(#FFFFCC,#CC9933);}
    .simple-linear24{ background: linear-gradient(#CC9933,#FF6666);}
    .simple-linear25{ background: linear-gradient(#FF6666,#FF9900);}
    .simple-linear26{ background: linear-gradient(#FF9900,#FFFF00);}
    .simple-linear27{ background: linear-gradient(#FFFF00,#0099CC);}
    .simple-linear28{ background: linear-gradient(#0099CC,#99CC33);}
    .simple-linear29{ background: linear-gradient(#99CC33,#FF9900);}
    .simple-linear30{ background: linear-gradient(#FF9900,#FFCC00);}
    .simple-linear31{ background: linear-gradient(#FFCC00,#FF9933);}
    .simple-linear32{ background: linear-gradient(#FF9933,#99CC33);}
    .simple-linear33{ background: linear-gradient(#99CC33,#CC6699);}
    .simple-linear34{ background: linear-gradient(#CC6699,#FF9933);}
    .simple-linear35{ background: linear-gradient(#FF9933,#FFFF00);}
    .simple-linear36{ background: linear-gradient(#FFFF00,#3366CC);}
    .simple-linear37{ background: linear-gradient(#3366CC,#FF9933);}
    .simple-linear38{ background: linear-gradient(#FF9933,#FFFFCC);}
    .simple-linear39{ background: linear-gradient(#FFFFCC,#009966);}
    .simple-linear40{ background: linear-gradient(#009966,#FF6600);}
    .simple-linear41{ background: linear-gradient(#FF6600,#FFFF66);}
    .simple-linear42{ background: linear-gradient(#FFFF66,#009966);}
    .simple-linear43{ background: linear-gradient(#009966,#990033);}
    .simple-linear44{ background: linear-gradient(#990033,#CCFF66);}
    .simple-linear45{ background: linear-gradient(#CCFF66,#FF9900);}
    .simple-linear46{ background: linear-gradient(#FF9900,#FF9966);}
    .simple-linear47{ background: linear-gradient(#FF9966,#996600);}
    .simple-linear48{ background: linear-gradient(#996600,#CCCC00);}
    .simple-linear49{ background: linear-gradient(#CCCC00,#CC6600);}
    .simple-linear50{ background: linear-gradient(#CC6600,#999999);}
    .simple-linear51{ background: linear-gradient(#999999,#CCCC33);}
    .simple-linear52{ background: linear-gradient(#CCCC33,#CC6600);}
    .simple-linear53{ background: linear-gradient(#CC6600,#CCCC33);}
    .simple-linear54{ background: linear-gradient(#CCCC33,#336699);}
    .simple-linear55{ background: linear-gradient(#336699,#CC3366);}
    .simple-linear56{ background: linear-gradient(#CC3366,#FF9933);}
    .simple-linear57{ background: linear-gradient(#FF9933,#999966);}
    .simple-linear58{ background: linear-gradient(#999966,#663300);}
    .simple-linear59{ background: linear-gradient(#663300,#FF9933);}
    .simple-linear60{ background: linear-gradient(#FF9933,#FFFF66);}
    .simple-linear61{ background: linear-gradient(#FFFF66,#990066);}
    .simple-linear62{ background: linear-gradient(#990066,#FFCC00);}
    .simple-linear63{ background: linear-gradient(#FFCC00,#CC0033);}
    .simple-linear64{ background: linear-gradient(#CC0033,#FFCC33);}
    .simple-linear65{ background: linear-gradient(#FFCC33,#333399);}
    .simple-linear66{ background: linear-gradient(#333399,#FF0033);}
    .simple-linear67{ background: linear-gradient(#FF0033,#666699);}
    .simple-linear68{ background: linear-gradient(#666699,#FFFF00);}
    .simple-linear69{ background: linear-gradient(#FFFF00,#CC3366);}
    .simple-linear70{ background: linear-gradient(#CC3366,#FF0033);}
    .simple-linear71{ background: linear-gradient(#FF0033,#006699);}
    .simple-linear72{ background: linear-gradient(#006699,#FFFF33);}
    .simple-linear73{ background: linear-gradient(#FFFF33,#FFCC00);}
    .simple-linear74{ background: linear-gradient(#FFCC00,#009999);}
    .simple-linear75{ background: linear-gradient(#009999,#CC3366);}
    .simple-linear76{ background: linear-gradient(#CC3366,#FF0033);}
    .simple-linear77{ background: linear-gradient(#FF0033,#CCCC00);}
    .simple-linear78{ background: linear-gradient(#CCCC00,#006699);}
    .simple-linear79{ background: linear-gradient(#006699,#CCCC00);}
    .simple-linear80{ background: linear-gradient(#CCCC00,#FF9933);}
    .simple-linear81{ background: linear-gradient(#FF9933,#663399);}
    .simple-linear82{ background: linear-gradient(#663399,#FF9933);}
    .simple-linear83{ background: linear-gradient(#FF9933,#FFFF00);}
    .simple-linear84{ background: linear-gradient(#FFFF00,#336699);}
    .simple-linear85{ background: linear-gradient(#336699,#CC3333);}
    .simple-linear86{ background: linear-gradient(#CC3333,#FFCCCC);}
    .simple-linear87{ background: linear-gradient(#FFCCCC,#99CC00);}
    .simple-linear88{ background: linear-gradient(#99CC00,#003399);}
    .simple-linear89{ background: linear-gradient(#003399,#FFFF00);}
    .simple-linear90{ background: linear-gradient(#FFFF00,#FF6600);}
    .simple-linear91{ background: linear-gradient(#FF6600,#FFCC99);}
    .simple-linear92{ background: linear-gradient(#FFCC99,#FFFF99);}
    .simple-linear93{ background: linear-gradient(#FFFF99,#99CC99);}
    .simple-linear94{ background: linear-gradient(#99CC99,#FFCC99);}
    .simple-linear95{ background: linear-gradient(#FFCC99,#CCFF99);}
    .simple-linear96{ background: linear-gradient(#CCFF99,#CCCCCC);}
    .simple-linear97{ background: linear-gradient(#CCCCCC,#FFCC99);}
    .simple-linear98{ background: linear-gradient(#FFCC99,#FFFFCC);}
    .simple-linear99{ background: linear-gradient(#FFFFCC,#99CCFF);}
    .simple-linear100{ background: linear-gradient(#99CCFF,#FF9966);}
    .simple-linear101{ background: linear-gradient(#FF9966,#FFFFCC);}
    .simple-linear102{ background: linear-gradient(#FFFFCC,#99CC99);}
    .simple-linear103{ background: linear-gradient(#99CC99,#FF9900);}
    .simple-linear104{ background: linear-gradient(#FF9900,#FFFFCC);}
    .simple-linear105{ background: linear-gradient(#FFFFCC,#336699);}
    .simple-linear106{ background: linear-gradient(#336699,#CCCC33);}
    .simple-linear107{ background: linear-gradient(#CCCC33,#FFFF99);}
    .simple-linear108{ background: linear-gradient(#FFFF99,#CC9933);}
    .simple-linear109{ background: linear-gradient(#CC9933,#996600);}
    .simple-linear110{ background: linear-gradient(#996600,#FFCC33);}
    .simple-linear111{ background: linear-gradient(#FFCC33,#FF9900);}
    .simple-linear112{ background: linear-gradient(#FF9900,#FFFFCC);}
    .simple-linear113{ background: linear-gradient(#FFFFCC,#CC9933);}
    .simple-linear114{ background: linear-gradient(#CC9933,#FF6666);}
    .simple-linear115{ background: linear-gradient(#FF6666,#FF9900);}
    .simple-linear116{ background: linear-gradient(#FF9900,#FFFF00);}
    .simple-linear117{ background: linear-gradient(#FFFF00,#0099CC);}
    .simple-linear118{ background: linear-gradient(#0099CC,#99CC33);}
    .simple-linear119{ background: linear-gradient(#99CC33,#FF9900);}
    .simple-linear120{ background: linear-gradient(#FF9900,#FFCC00);}
    .simple-linear121{ background: linear-gradient(#FFCC00,#FF9933);}
    .simple-linear122{ background: linear-gradient(#FF9933,#99CC33);}
    .simple-linear123{ background: linear-gradient(#99CC33,#CC6699);}
    .simple-linear124{ background: linear-gradient(#CC6699,#FF9933);}
    .simple-linear125{ background: linear-gradient(#FF9933,#FFFF00);}
    .simple-linear126{ background: linear-gradient(#FFFF00,#3366CC);}
    .simple-linear127{ background: linear-gradient(#3366CC,#FF9933);}
    .simple-linear128{ background: linear-gradient(#FF9933,#FFFFCC);}
    .simple-linear129{ background: linear-gradient(#FFFFCC,#009966);}
    .simple-linear130{ background: linear-gradient(#009966,#FF6600);}
    .simple-linear131{ background: linear-gradient(#FF6600,#FFFF66);}
    .simple-linear132{ background: linear-gradient(#FFFF66,#009966);}
    .simple-linear133{ background: linear-gradient(#009966,#990033);}
    .simple-linear134{ background: linear-gradient(#990033,#CCFF66);}
    .simple-linear135{ background: linear-gradient(#CCFF66,#FF9900);}
    .simple-linear136{ background: linear-gradient(#FF9900,#FF9966);}
    .simple-linear137{ background: linear-gradient(#FF9966,#996600);}
    .simple-linear138{ background: linear-gradient(#996600,#CCCC00);}
    .simple-linear139{ background: linear-gradient(#CCCC00,#CC6600);}
    .simple-linear140{ background: linear-gradient(#CC6600,#999999);}
    .simple-linear141{ background: linear-gradient(#999999,#CCCC33);}
    .simple-linear142{ background: linear-gradient(#CCCC33,#CC6600);}
    .simple-linear143{ background: linear-gradient(#CC6600,#CCCC33);}
    .simple-linear144{ background: linear-gradient(#CCCC33,#336699);}
    .simple-linear145{ background: linear-gradient(#336699,#000000);}
    .simple-linear146{ background: linear-gradient(#000000,#FF9933);}
    .simple-linear147{ background: linear-gradient(#FF9933,#999966);}
    .simple-linear148{ background: linear-gradient(#999966,#663300);}
    .simple-linear149{ background: linear-gradient(#663300,#FF9933);}
    .simple-linear150{ background: linear-gradient(#FF9933,#FFFF66);}
    </style>'''
    data = style + data
    path = os.getcwd()
    file = open(path+"/snake.html","w")
    file.write(data)
    print('写入文件成功')
    

    2、后面的企鹅动画

    小企鹅的动画用的是cv2计算机视觉插件,获取将视频转成视频帧,解析成字符

    import os
    import sys
    import numpy
    import cv2  # 读取视频 计算机视觉
    
    gray_num = list("▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▪▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫▫      ")
    
    
    def main(videoPath: str):
        # 1、获取视频 2、获取视频帧 3、循环处理视频帧 4、将图片解析成字符
        # 输出
        data = ""
        cap = cv2.VideoCapture(videoPath)  # 读取视频
    
        while True:
            success, frame = cap.read()  # 读取视频帧
            if not success:
                break
            # 转换灰度图
            grayFrame = cv2.cvtColor(frame, cv2.COLOR_RGB2GRAY)
            # 调整尺寸
            tsize = os.get_terminal_size()
            fixFrame = cv2.resize(grayFrame, (tsize.columns, int(tsize.lines)))
            img_array = numpy.array(fixFrame, "f")
            asciiFrame = ""
            for line in img_array:
                row = ""
                blank = 0
                flag = 0 
                for p in line:
                    # p 浮点数数字
                    n = (p/255)*(len(gray_num)-1)  # 灰度像素在字符列表中的位置
                    index = int(n)  # 转换为整数
                    text = gray_num[index]
                    #如果碰到非空白像素,flag+1
                    if text != " ":
                        flag += 1
                        if flag == 1:
                            row = row + "<span style='font-size:18px;line-height:1pt'>" + "&nbsp;"*blank + "</span>"
                            blank = 0
                        row += text
                    else:
                        flag = 0
                        blank += 1
                asciiFrame = asciiFrame + "<p style='font-size:1.0pt;'>" + row[:-1] + "</p>" + "\n"  # 字符画帧换行
            print(asciiFrame)  # 输出
            data = data + "<div style='height:719px;'>" + asciiFrame + "</div>"
        cap.release()
        path = os.getcwd()
        file = open(path+"/txt.html","w")
        file.write(data)
        print('写入文件成功')
    
    
    if __name__ == "__main__":
        if len(sys.argv) > 1 and os.path.exists(sys.argv[1]):
            main(sys.argv[1])
        else:
            print("No File")
    

    3、屏幕自动下滑代码

    import pyautogui
    
    while(1):
    	# 负值为向下滚动,正值向上滚动,如果视觉往下走,就是有点慢,应该加点数值
    	# 企鹅速度
    	pyautogui.scroll(-18)
    	# 效果1丝带速度
    	# pyautogui.scroll(-11)
    

    视频中的字符动画的文档和代码我都放到下面链接中了,大家想要做类似视频的话可以参考~~

    链接:
    https://pan.baidu.com/s/10fUIkXkq8d1S8RcuTafnFQ
    密码:9cca

    展开全文
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:Hanz —1— 如果你对本文的代码感兴趣,可以去 Github (文末提供)里查看。...
  • python动画爱心

    千次阅读 2020-02-28 21:33:39
    # 第一个画面,显示文字 def page0 ( ) : turtle . penup ( ) turtle . goto ( - 350 , 0 ) turtle . color ( 'black' ) turtle . write ( '专属于我们的情人节' , font = ( '宋体' , 60 , 'normal...
  • 2.使用win32com操作ppt2.1 pip安装win32com2.2 win32com复制ppt模板3.python-pptx 创建PPT、复制页面3.1 pip安装python-pptx3.2 python-pptx 复制页面3.3 python-pptx 删除页面3.4 新建页面4.python-pptx 插入文字、...
  • Python动画设计教程】系列文章目录 【第一讲】软件准备 【第二讲】搭建界面,Excel读取,图片读取 【第三讲】图像绘制 【第四讲】制作动画 【第五讲】问题处理 文章目录1 轮换序列的表格2 根据表格轮换图片3 使用...
  • Python制作字符版gif图

    2020-08-13 15:46:19
    对图片的操作我们可以使用PIL、imageio和image2gif库,处理像素我们选择使用opencv-python这个库。NumPy是Python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。...
  • 参考: https://zhuanlan.zhihu.com/p/69839386 ...安装依赖可能麻烦点: 运行: python3 FlashText1.py --text /Users/lonng/youtube_v/2a_kor1.txt --music /Users/lonng/Desktop/v+/mp3/Smi...
  • 推荐图书:《Python可以这样学》,ISBN:9787302456469,董付国,清华大学出版社,第9次印刷图书详情(京东):董付国老师17本Python系列图书均提供配套教学资源。=...
  • 今天我就给大家介绍一下,如何用Python绘制动态图表。 主要是使用到Matplotlib+imageio,其中Matplotlib就有一个Animation类,可以生成动图GIF,不过使用起来学习成本较高,还是有一定难度的。 这里我将先创建静态...
  • 通常大家做出来的图表,绝大部分都是静态的,有时会显得不够吸引人。今天小F就给大家介绍一下,如何用Python绘制动态图表。主要是使用到Matplotlib+imageio,其中Matplo...
  • Python制作动态饼图

    2021-01-14 16:04:45
    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 python免费学习资料以及群交流解答点击...
  • 前言 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业...今天就分享一下如何让可视化秀起来:用Python和matplotlib制作GIF图表。 假如电脑上没有安装ImageMagick,先去这里(https://www.imagemagick.o
  • 采坑Python制作全国疫情地图

    千次阅读 2020-02-17 17:14:16
    看了微信大牛用Python绘制全国疫情地图,也手痒试一把。 基本步骤就是: 1.安装环境 2.抓取数据 3.绘制地图 4.输出网页 一、爬取数据 1)安装常用的python爬虫工具:beautifulsoup4、requests pip install requests ...
  • 制作汉字书写笔画顺序的多媒体课件,如果使用传统的GIF动画软件,制作起来并不困难,但缺点是需要逐帧制作大量图片,生成的文件体积庞大,播放效果较差。而Flash动画创作灵活高效,生成的文件体积小、质量好,因此...
  • Python+Kepler.gl轻松制作酷炫路径动画

    千次阅读 2020-05-31 19:05:10
    本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。 作者:费弗里 欢迎点击左上角关注小编,除了分享技术文章之外还有很多福利,私信学习资料...
  • 如下: 进入power shell窗口后依次输入conda activate、python setup.py install命令,再依次按enter键,如下: 安装成功提示,如下: 提示: 通过pip install bar_chart_race命令只能下载到0.1版本,而我们需要0.2...
  • 在这篇博客中,我们将学习如何使用Python,OpenCV,dlib和ImageMagick工具箱创建动画GIF。 使用OpenCV构建一个模因生成器!我们以多种实用方式利用了计算机视觉和深度学习,包括:人脸检测、面部标志预测、提取...
  • 本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。 PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 python免费学习资料、代码以及交流解答点击...
  • 使用Python+百度AI把文字转成语音

    千次阅读 2020-05-24 00:11:20
    使用Python+百度AI把文字转成语音 随着AI技术的发展,音视频的自动生成转换技术已经被越来越多的应用,很多内容网站都在文章内容页面嵌入了语音朗读功能,AI合成主播也开始在新闻媒体中应用。 这个就是新华社联合...
  • Python剪辑制作简单视频(moviepy)

    万次阅读 2018-04-15 21:51:38
    把玩了下moviepy蛮有意思的, 记录下来方便以后使用(ps: 其实直接看官网就可以无视该教程了: https://pypi.python.org/pypi/moviepy)1. 环境(1) pip install moviepy(2) 安装 ImageMagick, ...
  • Python制作一个简单的抽奖软件(二) 认识QT 因为都对 QT和tkinter都没用过,之前简单使用tkinter后发现,界面调整不太好弄。然后度娘了之后,QT是强大GUI库之一,很多人都推荐它。重新选择QT进行尝试。于是,就...
  • 父亲节到了,教你用Python动画神器送上节日祝福

    千次阅读 多人点赞 2019-06-15 13:59:10
    我上周介绍了3b1b的manim项目用Python快乐学数学,Github万星神器Manim简介,原计划在暑假期间教一下孩子在manim上做一个入门动画。结果没想到在今天教孩子“hello world"的时候,宝宝竟然还记得周末是父亲节,直接...
  • 点击上方“涛哥聊Python”,选择“星标”公众号重磅干货,第一时间送达来源:水代码工作室响应号召,宅在家里。修修小技术,水水小代码。加油!热干面!首先我们假设Python的基本环境已经...
  • Python默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter),从这个名字就可以看出它是基于Tk的,Tk是一个工具包,最初是为Tcl设计的,后来被移植到很多其他的脚本语言中,它提供了跨平台的GUI控...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,494
精华内容 1,397
关键字:

python制作文字动画

python 订阅