用Python将动态GIF图片倒放播放的方法


Posted in Python onNovember 02, 2016

这次让我们一个用 Python 做一个小工具:将动态 GIF 图片倒序播放!

用Python将动态GIF图片倒放播放的方法

GIF(Graphics Interchange Format) 是一种可以用来呈现动画效果的图片格式,原理就是保存很多帧(Frame)静态图像,然后连续呈现。很多简短的视频也会被转换成动态 GIF 呈现,压缩画质和去除声音之后可以有效地减小文件大小。网络上不计其数的搞笑动图,几乎承载了网友大半的欢乐,但是也有人发现,将正常的动画倒序播放往往可以获得更搞笑的效果,Reddit 上甚至有一个专门的节点:/r/reversegif。

要做到这一点其实很简单,只要从原始图片中提取中间每一帧静态图像,然后将顺序颠倒之后重新生成一张 GIF 图片即可。Python 中专门用于处理图像的库是 PIL,在 PIL 基础上由 Alex Clark 等人开发了一个更友好的版本:Pillow。于是首先来安装(或升级)Pillow:

pip install --upgrade pillow -i http://pypi.douban.com/simple
python -c "import PIL; print(PIL.VERSION, '\t', PIL.PILLOW_VERSION)"
// 1.1.7 3.4.2
利用 Pillow 可以先读取图片文件并判断该图片是否为动态图片及其帧数:
from PIL import Imagewith Image.open('ani.gif') as im:
print(im.is_animated, im.n_frames)

新版本的 Pillow 提供了更多写入 GIF 的功能:

im.save(out, save_all=True, append_images=[im1, im2, ...])

通过设定 save_all=True 参数和 append_images 可以一次性将多帧图像同时存入 GIF 图片,于是我们可以这样来生成倒序播放的图片:

from PIL import Image, ImageSequence
with Image.open('ani.gif') as im:
if im.is_animated:
frames = [f.copy() for f in ImageSequence.Iterator(im)]
frames.reverse() # 内置列表倒序方法
# 将倒序后的所有帧图像保存下来
frames[0].save('out.gif', save_all=True, append_images=frames[1:])

用Python将动态GIF图片倒放播放的方法

再来看一个比较明显的效果:

用Python将动态GIF图片倒放播放的方法

为了满足微信2M 图片大小限制,倒序图片经过了采样压缩处理

如果想要达到鬼畜一些的效果,还可以对所有帧随机打乱顺序:

import random
# frames.reverse()
random.shuffle(frames)

效果如下:

用Python将动态GIF图片倒放播放的方法

以上所述是小编给大家介绍的用Python将动态GIF图片倒放播放的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Python 相关文章推荐
Python实现周期性抓取网页内容的方法
Nov 04 Python
python中zip()方法应用实例分析
Apr 16 Python
详解Python中for循环是如何工作的
Jun 30 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
基于Python实现迪杰斯特拉和弗洛伊德算法
May 27 Python
学python安装的软件总结
Oct 12 Python
Python找出列表中出现次数最多的元素三种方式
Feb 24 Python
python计算导数并绘图的实例
Feb 29 Python
Python读入mnist二进制图像文件并显示实例
Apr 24 Python
Python OpenCV 图像平移的实现示例
Jun 04 Python
python机器学习实现oneR算法(以鸢尾data为例)
Mar 03 Python
Python自动化工具之实现Excel转Markdown表格
Apr 08 Python
各种Python库安装包下载地址与安装过程详细介绍(Windows版)
Nov 02 #Python
Python实现简单的四则运算计算器
Nov 02 #Python
利用Python命令行传递实例化对象的方法
Nov 02 #Python
Python 性能优化技巧总结
Nov 01 #Python
python字典多键值及重复键值的使用方法(详解)
Oct 31 #Python
浅谈django中的认证与登录
Oct 31 #Python
python 把数据 json格式输出的实例代码
Oct 31 #Python
You might like
基于PHP遍历数组的方法汇总分析
2013/06/08 PHP
那些年我们错过的魔术方法(Magic Methods)
2014/01/14 PHP
带密匙的php加密解密示例分享
2014/01/29 PHP
PHP获取网页标题的3种实现方法代码实例
2014/04/11 PHP
mac系统下安装多个php并自由切换的方法详解
2017/04/21 PHP
PHP简单实现记录网站访问量功能示例
2018/06/06 PHP
在laravel5.2中实现点击用户头像更改头像的方法
2019/10/14 PHP
javascript实现图片切换的幻灯片效果源代码
2012/12/12 Javascript
node.js中的buffer.write方法使用说明
2014/12/10 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
Node.js程序中的本地文件操作用法小结
2016/03/06 Javascript
微信小程序  audio音频播放详解及实例
2016/11/02 Javascript
vue jsx 使用指南及vue.js 使用jsx语法的方法
2017/11/11 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
微信小程序视图容器(swiper)组件创建轮播图
2020/06/19 Javascript
vue获取元素宽、高、距离左边距离,右,上距离等还有XY坐标轴的方法
2018/09/05 Javascript
如何使用原生Js实现随机点名详解
2021/01/06 Javascript
python中map()与zip()操作方法
2016/02/27 Python
python2.7实现爬虫网页数据
2018/05/25 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
详解pyinstaller生成exe的闪退问题解决方案
2020/06/19 Python
解决keras GAN训练是loss不发生变化,accuracy一直为0.5的问题
2020/07/02 Python
Python多分支if语句的使用
2020/09/03 Python
Python Merge函数原理及用法解析
2020/09/16 Python
细说CSS3中box属性中的overflow-x属性和overflow-y属性值的效果
2014/07/21 HTML / CSS
HTML5 Canvas实现图片缩放、翻转、颜色渐变的代码示例
2016/02/28 HTML / CSS
The Hut德国站点:时装、家居用品、美容等
2016/09/23 全球购物
英国评分最高的女性剃须刀订阅盒:FFS Beauty
2018/01/25 全球购物
Origins悦木之源香港官网:雅诗兰黛集团高端植物护肤品牌
2018/03/21 全球购物
施工材料员岗位职责
2014/02/12 职场文书
安全责任书范本
2014/04/15 职场文书
2014年生产管理工作总结
2014/12/23 职场文书
大学生读书笔记大全
2015/07/01 职场文书
听课评课活动心得体会
2016/01/15 职场文书
高中美术教学反思
2016/02/17 职场文书
Redis实战之Lettuce的使用技巧详解
2022/12/24 Redis