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

作者:mrr 时间:2023-02-17 07:39:51 

这次让我们一个用 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,gif
0
投稿

猜你喜欢

  • SQL的常用数据类型列表详解

    2024-01-15 05:25:07
  • python如何查看微信消息撤回

    2023-07-31 23:18:09
  • 如何查看SQLSERVER中某个查询用了多少TempDB空间

    2024-01-16 06:40:21
  • php生成图片验证码的实例讲解

    2023-09-11 21:36:29
  • Vuex 使用 v-model 配合 state的方法

    2024-05-02 16:44:43
  • mysql binlog(二进制日志)查看方法

    2024-01-18 02:30:12
  • golang调试bug及性能监控方式实践总结

    2024-04-23 09:41:37
  • python之pyqt5通过按钮改变Label的背景颜色方法

    2021-04-03 22:59:52
  • Vue中使用vee-validate表单验证的方法

    2024-06-05 15:29:04
  • 你不知道的Vue技巧之--开发一个可以通过方法调用的组件(推荐)

    2024-04-30 08:46:07
  • 简介Django框架中可使用的各类缓存

    2022-01-16 13:02:39
  • python 读取文件并替换字段的实例

    2022-10-18 05:12:21
  • python使用scapy模块实现ping扫描的过程详解

    2023-07-07 05:29:24
  • 极力推荐10个短小实用的JavaScript代码段

    2024-06-05 09:12:40
  • python GUI编程实现扫雷游戏

    2023-10-27 20:41:29
  • 如何在Python中安装GDAL库

    2023-08-22 01:51:54
  • Python深入浅出分析元类

    2022-01-10 09:09:00
  • python基础学习之组织文件

    2022-04-08 21:47:23
  • MySQL HandlerSocket插件安装配置教程

    2024-01-20 09:37:55
  • 解决python删除文件的权限错误问题

    2023-09-06 07:33:36
  • asp之家 网络编程 m.aspxhome.com