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

 更新时间:2016年11月02日 14:41:01   投稿:mrr  
GIF(Graphics Interchange Format) 是一种可以用来呈现动画效果的图片格式,原理就是保存很多帧(Frame)静态图像,然后连续呈现。这篇文章主要介绍了用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:])

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


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

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

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

效果如下:

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

相关文章

  • 解决Python对齐文本字符串问题

    解决Python对齐文本字符串问题

    这篇文章主要介绍了解决Python对齐文本字符串问题,需要的朋友可以参考下
    2019-08-08
  • Python闭包装饰器使用方法汇总

    Python闭包装饰器使用方法汇总

    这篇文章主要介绍了Python闭包装饰器使用方法汇总,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • matlab中二维插值函数interp2的使用详解

    matlab中二维插值函数interp2的使用详解

    这篇文章主要介绍了matlab中二维插值函数interp2的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python利用scapy实现ARP欺骗的方法

    Python利用scapy实现ARP欺骗的方法

    今天小编就为大家分享一篇Python利用scapy实现ARP欺骗的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-07-07
  • Python2与Python3的区别点整理

    Python2与Python3的区别点整理

    在本篇文章里小编给大家整理的是关于Python2与Python3的区别点整理内容,需要的朋友们可以参考下。
    2019-12-12
  • Python编程入门指南之函数

    Python编程入门指南之函数

    这篇文章主要为大家介绍了Python编程之函数,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • Python操作MongoDB数据库PyMongo库使用方法

    Python操作MongoDB数据库PyMongo库使用方法

    这篇文章主要介绍了Python操作MongoDB数据库PyMongo库使用方法,本文讲解了创建连接、连接数据库、连接聚集、查看全部聚集名称、查看聚集的一条记录等操作方法,需要的朋友可以参考下
    2015-04-04
  • python中列表和元组的区别

    python中列表和元组的区别

    给大家详细讲解了python中列表和元组的区别,需要的朋友参考一下。
    2017-12-12
  • 代码分析Python地图坐标转换

    代码分析Python地图坐标转换

    这篇文章主要介绍了Python地图坐标转换的相关知识点以及分享了相关的代码实例,对此有兴趣的朋友学习下。
    2018-02-02
  • Python标准库calendar的使用方法

    Python标准库calendar的使用方法

    本文主要介绍了Python标准库calendar的使用方法,calendar模块主要由Calendar类与一些模块方法构成,Calendar类又衍生了一些子孙类来帮助我们实现一些特殊的功能,感兴趣的可以了解一下
    2021-11-11

最新评论