Python实现动态图解析、合成与倒放


Posted in Python onJanuary 18, 2018

动态图现在已经融入了我们的日常网络生活,大大丰富了我们的表达方式和交流趣味性。常常是一言不合就扔动图,我这里就不举例子了,例子太多,平时大家也都接触过。咱们直接开始本文的内容。

用到的库和模块

今天用看看如何用Python写个程序,进行动态图的解析、合成与倒放。这里我们用到的库有且只有PIL。而且只用到了PIL的两个模块Image和ImageSequence。顾名思义,就是图像模块和图像序列模块。动态图正好可以看作是图像序列。

简单的原理和代码

所谓动态图的解析,就是把GIF格式的图片转化为图片流的过程,而动态图的合成就是把图片流重新合成GIF图片的过程。而所谓动态图倒放,就是把图片流反序之后再合成GIF了。

原理上没啥难以理解的,我们还是直接看代码。

from PIL import Image, ImageSequence 

# 读取GIF
im = Image.open("5.gif")
# GIF图片流的迭代器
iter = ImageSequence.Iterator(im)

index = 1
# 遍历图片流的每一帧
for frame in iter:
 print("image %d: mode %s, size %s" % (index, frame.mode, frame.size))
 frame.save("./imgs/frame%d.png" % index)
 index += 1

# frame0 = frames[0]
# frame0.show()

# 把GIF拆分为图片流
imgs = [frame.copy() for frame in ImageSequence.Iterator(im)]
# 把图片流重新成成GIF动图
imgs[0].save('out.gif', save_all=True, append_images=imgs[1:])

# 图片流反序
imgs.reverse() 
# 将反序后的所有帧图像保存下来
imgs[0].save('./reverse_out.gif', save_all=True, append_images=imgs[1:])

效果

以下是动图原图、效果图。

Python实现动态图解析、合成与倒放

倒放的动态图

Python实现动态图解析、合成与倒放

动态图解析得到的图片流:

Python实现动态图解析、合成与倒放

补充说明

加上注释之后的代码完全没啥可说的有木有?

其实还还是有些地方可说的,比如图片为啥保存为PNG格式的,JPG行不行?比如第六行与第19行末尾的代码是否重复,第19行末尾能不能用iter代替?

这些问题知道的就算了,不知道的希望能够自己跑一跑代码,查一查资料,补充下这方面的小知识。

除此之外,还有哪些补充知识的方法呢?当然是看书啦~

Python 相关文章推荐
Python基础入门之seed()方法的使用
May 15 Python
Python编程中的文件操作攻略
Oct 16 Python
浅析Python中的for 循环
Jun 09 Python
Python中str.format()详解
Mar 12 Python
pandas 数据归一化以及行删除例程的方法
Nov 10 Python
浅谈numpy生成数组的零值问题
Nov 12 Python
python retrying模块的使用方法详解
Sep 25 Python
解决Python3下map函数的显示问题
Dec 04 Python
opencv3/C++ 平面对象识别&透视变换方式
Dec 11 Python
使用Python制作缩放自如的圣诞老人(圣诞树)
Dec 25 Python
解决python使用list()时总是报错的问题
May 05 Python
python设置 matplotlib 正确显示中文的四种方式
May 10 Python
Python基于matplotlib实现绘制三维图形功能示例
Jan 18 #Python
Python实现在tkinter中使用matplotlib绘制图形的方法示例
Jan 18 #Python
python中requests和https使用简单示例
Jan 18 #Python
Python使用matplotlib实现绘制自定义图形功能示例
Jan 18 #Python
Python基于csv模块实现读取与写入csv数据的方法
Jan 18 #Python
python将字典内容存入mysql实例代码
Jan 18 #Python
python测试mysql写入性能完整实例
Jan 18 #Python
You might like
具有时效性的php加密解密函数代码
2013/06/19 PHP
php计算一个文件大小的方法
2015/03/30 PHP
CodeIgniter视图使用注意事项
2016/01/20 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
thinkPHP中配置的读取与C方法详解
2016/12/05 PHP
PHP随机数函数rand()与mt_rand()的讲解
2019/03/25 PHP
javascript自启动函数的问题探讨
2013/10/05 Javascript
javascript 函数声明与函数表达式的区别介绍
2013/10/05 Javascript
JavaScript闭包实例讲解
2014/04/22 Javascript
javascript控制图片播放的实现代码
2020/07/29 Javascript
详解javascript实现瀑布流列式布局
2016/01/29 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
javascript设计模式Constructor(构造器)模式
2016/08/19 Javascript
简单好用的nodejs 爬虫框架分享
2017/03/26 NodeJs
js 将canvas生成图片保存,或直接保存一张图片的实现方法
2018/01/02 Javascript
从零开始搭建webpack+react开发环境的详细步骤
2018/05/18 Javascript
Vue resource三种请求格式和万能测试地址
2018/09/26 Javascript
Python下使用Psyco模块优化运行速度
2015/04/05 Python
Python使用openpyxl读写excel文件的方法
2017/06/30 Python
python实现文件助手中查看微信撤回消息
2019/04/29 Python
详解Python流程控制语句
2020/10/28 Python
用ldap作为django后端用户登录验证的实现
2020/12/07 Python
波兰电子产品购物网站:Vobis
2019/05/26 全球购物
sealed修饰符是干什么的
2012/10/23 面试题
说说在weblogic中开发消息Bean时的persistent与non-persisten的差别
2013/04/07 面试题
行政部总经理岗位职责
2014/01/04 职场文书
高一数学教学反思
2014/02/07 职场文书
咖啡厅商业计划书
2014/09/15 职场文书
兼职安全员岗位职责
2015/02/15 职场文书
医生辞职信范文
2015/03/02 职场文书
2015年度合同管理工作总结
2015/05/22 职场文书
观看安全警示教育片心得体会
2016/01/15 职场文书
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android
Django中celery的使用项目实例
2022/07/07 Python