逐字动画不独享,自动生成皆有它。2行代码自动生成字幕gif动画。
李兴球 李兴球Python 今天
最近造了一个小轮子,它的名字叫gameturtle。中文为游戏海龟。这个模块提供了Sprite,即角色类。用它可以配合tkinter模块制作有趣的动画和游戏。内置了像素级别碰撞检测等功能。最后一次版本是0.262版,增加了拆帧,合帧,自动生成字幕gif动画的功能。这样,别人用十几行,几十行代码解决的问题。我只要三、四行代码就能解决,大大提升了我的编程效率。我经常用来它来干些小活。运转得还不错,想用的可以拿去用。读者只需要用cmd命令打开管理员窗口,输入pip install gameturtle即可自动安装了。就像下面这样:
一段文字,我们需要把它们逐字地在一张背景图片上显示出来,就像下面这样:
要实现自动生成上面的gif动画,需要多少行代码呢?
下面主要有2行代码就行了。代码依次如下所示:
from gameturtle import txt2images,makegif
s = "学会编程能提升认知水平吗?一切都得自己实践呀。不过自从学了Python,我的认知水平确实提升了很多。"
frames = txt2images(s) # 返回列表,保存逐帧字幕
makegif(frames,'提升认知.gif') # 合并所有帧到gif文件中。
第一行代码是从gameturtle模块里导入了两个命令。
txt2images命令能把字符串转换成逐帧的图形。
makegif能把所有帧合成到一张gif图里面。
上面的代码太简单了。如何修改上面gif动画的背景图、字体大小、颜色等呢?下面我们看一下txt2images函数的定义头:
def txt2images(string,width=480,height=360,background=None,margin=68,fontsize=18,
fontfile="simkai.ttf",fgcolor=(150,200,200,255),bgcolor=(0,0,0,0)):
"""文本转逐帧图像,string:字符串,width:宽度,height:高度,background:背景图或颜色,
margin:边距,fontsize:字体大小,fgcolor:字的颜色,bgcolor:背景色
"""
我们看到,它9个参数。
第1个参数,string表示要在图片上写的字。它是一个字符串。
第2个参数,width表示生成的gif图的宽度。
第3个参数,height表示生成的gif图片的高度。
第4个参数,background表示生成的gif图片的背景图形。默认为None表示没有背景图。
第5个参数,margin是边距,表示字距离图片上、左、右的像素距离。
第6个参数,fontsize就是字体大小了。
第7个参数,fontfile,这是字体文件,默认为楷体字。
第8个参数,fgcolor,这是字的前景色,也就是字的颜色了。
第9个参数,bgcolor,这是没有背景图时的背景颜色。
这个函数返回所有帧,也就是返回所有图形对象的列表,以便外部调用这个列表。现在,读者应该知道如何使用txt2images这个命令了吧。
那么makegif命令有些什么参数呢?它是用来合帧的。所谓合帧就是把图片都放在一张gif图里,让它们每隔一定的时间显示。
下面我们来看下它的函数定义:
def makegif(images,filename=None,duration=200,quality=85):
"""合帧
images: 列表或者一个路径。如果是列表,则里面的是图形对象。如果是路径,则是一个字符串而已
filename: 输出的gif文件名
注意path下面的文件名要是这样的:0.png,1.png,2.png....
"""
从上面我们能看出,它的第一个参数是images,这表示一些图片。这个参数又大致分为两种情况:
如果images是一个路径,那么这个路径下面的图片文件名应该依次是0.png,1.png,2.png,3.png....。
如果images是一个列表或者元组,那么它里面应该是一些图形对象。这些图形对象可以用txt2images命令生成。
第2个参数是filename,也就是待生成的gif文件名。如果这个参数值为None,则函数会随机生成一个文件名。
第3个参数是duration,表示gif文件中每张图片默认显示的时间,单位是毫秒。
第4个参数是quality,这是质量。100表示质量最高,当然,生成的gif文件也越大。
上面的makegif是用来合帧的,其实gameturtle模块里还提供了拆帧命令,即splitgif。这样,别人用好多行代码才能解决,用splitgif命令,一行代码搞定。关键是还支持一种扩展名为webp的动态图片文件!这个函数只有一个参数,就是gif文件名。它返回所有帧形成的列表和自己的pillow图形对象。
所谓pillow图形对象就是用pillow模块Image的open或者new命令返回的图形对象。通过它能访问图形的一些属性。其实每一帧都是一个pillow图形对象。下面是一个简单的例子。
import os
from gameturtle import splitgif
file = 'sun.gif'
frames,im = splitgif(file) # 拆帧,支持gif和webp格式的动图
print('所有帧:',frames)
print()
print()
print('图形对象信息:',im.info)
path = 'frames'
if not os.path.exists(path):os.mkdir(path)# 如果path不存在,则建立这个文件夹
i = 0
for fm in frames:
filename = f"{path}/{i}.png"
fm.save(filename)
i += 1
上面的程序把sun.gif文件拆成了很多帧,都保存在frames列表中。im则是gif文件在内存中的包装。通过im可以访问到图像的各种属性,如宽度,高度,gif图是否循环播放。每一帧播放的时间间隔。
笔者特别编写了几个例子,还附有素材。想要的关注 李兴球Python公众号,回复:makegif 即可免费下载。