图片来源:《鬼灭之刃》 op 截屏
gif 格式的图片不但自带“能动”属性,还可作为“表情”被收入微信表情包。随手制作 gif 表情包可以算得上是当代沙雕青年的必备技能之一了。
制作 gif 比较流行的方法是:下载一个专门生成表情包的软件、访问一个在线转换的网站并按顺序上传图片或使用 Photoshop 里面的“时间轴”面板。
但只是为了将几张图片“捏”在一起,产生一个能动的效果,上述方法其实都有些大材小用,并且还不是很方便。
如果不是需要很好的压缩算法,我们完全可以在自己的计算机上轻量、快捷地完成“一键式”转换,因此我们仅需要代码帮我们完成:
-
读取现有图片到内存;
-
整理内存中的图片信息,符合 gif 格式规范;
-
输出 gif 图片。
python 丰富的生态为我们提供了一个很方便的解决方案:
-
imageio.imread() 将图片保存为 RGB 点阵于内存中;
-
imageio.mimsave(gif_path, frames, ‘GIF’, duration) 将 frames 中的点阵对象整合,输出 gif 文件到硬盘上。
我对其稍加整理如下:
if __name__ == "__main__":
# path init
path = os.path.join(__file__, "..")
# read pngs
file_list = os.listdir(path)
png_list = file_list.copy()
for file in file_list:
if file[-4:]!=".png":
png_list.remove(file)
png_list.sort(key=lambda x: int(x[:-4]))
# now all the pngs are in the png_list
# and sorted well from min to max
# turn pngs into a gif file
frames = []
for png in png_list:
# get the png file's path
image_path = os.path.join(path, png)
# imageio.imread() to get RGB matrix
# frames is a list which stores the pngs in order
frames.append(imageio.imread(image_path))
# production path
gif_path = os.path.join(path, "my_gif.gif")
imageio.mimsave(gif_path, frames, 'GIF', duration=DURATION)
print("done")
pass
怎么使用呢?
- 首先,建一个空的文件夹,把你的 png 图片保存在其中;
- png 图片命名要以数字命名,顺序越前的图片数字越小;
- 该文件夹内,新建一个 python file ,保存上述代码于其中;
- 依靠编辑器或命令行运行这个 .py!
- 你将看到 my_gif.gif 文件已经出现在你的文件夹中了。
很多时候,由于 gif 多了“时间”这个维度,图片的顺序、创意、内容等多种元素组合在一起,可以带来比一张图片好很多的效果。比如,可以给女朋友做一套“相册”,这可比修图浪漫多了:
还可以给公众号制作个粗糙的头图:
值得注意的是,如果你想使用上述方案,图片大小尽量保持一致。
感谢阅读,公众号:Piper蛋窝。
可以访问我的仓库(阅读原文):
https://github.com/PiperLiu/interesting-python3/tree/master/visual-python/imageio2gif