Python图像处理之gif动态图的解析与合成操作详解


Posted in Python onDecember 30, 2018

本文实例讲述了Python图像处理之gif动态图的解析与合成操作。分享给大家供大家参考,具体如下:

gif动态图是在现在已经司空见惯,朋友圈里也经常是一言不合就斗图。这里,就介绍下如何使用python来解析和生成gif图像。

一、gif动态图的合成

如下图,是一个gif动态图。

Python图像处理之gif动态图的解析与合成操作详解

gif动态图的解析可以使用PIL图像模块即可,具体代码如下:

#-*- coding: UTF-8 -*-
import os
from PIL import Image
def analyseImage(path):
  '''
  Pre-process pass over the image to determine the mode (full or additive).
  Necessary as assessing single frames isn't reliable. Need to know the mode
  before processing all frames.
  '''
  im = Image.open(path)
  results = {
    'size': im.size,
    'mode': 'full',
  }
  try:
    while True:
      if im.tile:
        tile = im.tile[0]
        update_region = tile[1]
        update_region_dimensions = update_region[2:]
        if update_region_dimensions != im.size:
          results['mode'] = 'partial'
          break
      im.seek(im.tell() + 1)
  except EOFError:
    pass
  return results
def processImage(path):
  '''
  Iterate the GIF, extracting each frame.
  '''
  mode = analyseImage(path)['mode']
  im = Image.open(path)
  i = 0
  p = im.getpalette()
  last_frame = im.convert('RGBA')
  try:
    while True:
      print "saving %s (%s) frame %d, %s %s" % (path, mode, i, im.size, im.tile)
      '''
      If the GIF uses local colour tables, each frame will have its own palette.
      If not, we need to apply the global palette to the new frame.
      '''
      if not im.getpalette():
        im.putpalette(p)
      new_frame = Image.new('RGBA', im.size)
      '''
      Is this file a "partial"-mode GIF where frames update a region of a different size to the entire image?
      If so, we need to construct the new frame by pasting it on top of the preceding frames.
      '''
      if mode == 'partial':
        new_frame.paste(last_frame)
      new_frame.paste(im, (0,0), im.convert('RGBA'))
      new_frame.save('%s-%d.png' % (''.join(os.path.basename(path).split('.')[:-1]), i), 'PNG')
      i += 1
      last_frame = new_frame
      im.seek(im.tell() + 1)
  except EOFError:
    pass
def main():
  processImage('test_gif.gif')
if __name__ == "__main__":
  main()

解析结果如下,由此可见改动态图实际上是由14张相同分辨率的静态图组合而成

Python图像处理之gif动态图的解析与合成操作详解

二、gif动态图的合成

gif图像的合成,使用imageio库(https://pypi.python.org/pypi/imageio)

代码如下:

#-*- coding: UTF-8 -*-
import imageio
def create_gif(image_list, gif_name):
  frames = []
  for image_name in image_list:
    frames.append(imageio.imread(image_name))
  # Save them as frames into a gif
  imageio.mimsave(gif_name, frames, 'GIF', duration = 0.1)
  return
def main():
  image_list = ['test_gif-0.png', 'test_gif-2.png', 'test_gif-4.png',
         'test_gif-6.png', 'test_gif-8.png', 'test_gif-10.png']
  gif_name = 'created_gif.gif'
  create_gif(image_list, gif_name)
if __name__ == "__main__":
  main()

这里,使用第一步解析出来的图像中的8幅图,间副的间隔时间为0.1s,合成新的gif动态图如下:

Python图像处理之gif动态图的解析与合成操作详解

更多关于Python相关内容可查看本站专题:《Python数学运算技巧总结》、《Python图片操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
详解python中的线程
Feb 10 Python
Python之用户输入的实例
Jun 22 Python
pyqt5实现绘制ui,列表窗口,滚动窗口显示图片的方法
Jun 20 Python
python绘制无向图度分布曲线示例
Nov 22 Python
python二维键值数组生成转json的例子
Dec 06 Python
Python实现密码薄文件读写操作
Dec 16 Python
python每5分钟从kafka中提取数据的例子
Dec 23 Python
python3中关于excel追加写入格式被覆盖问题(实例代码)
Jan 10 Python
python图片剪裁代码(图片按四个点坐标剪裁)
Mar 10 Python
pyqt5 QlistView列表显示的实现示例
Mar 24 Python
如何在sublime编辑器中安装python
May 20 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
python爬虫获取小区经纬度以及结构化地址
Dec 30 #Python
python实现播放音频和录音功能示例代码
Dec 30 #Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 #Python
python中partial()基础用法说明
Dec 30 #Python
python读取各种文件数据方法解析
Dec 29 #Python
python 读取鼠标点击坐标的实例
Dec 29 #Python
对python for 文件指定行读写操作详解
Dec 29 #Python
You might like
在PHP中使用模板的方法
2008/05/24 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
PHP大批量插入数据库的3种方法和速度对比
2014/07/08 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
短信提示使用 特效
2007/01/19 Javascript
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
判断js对象是否拥有某一个属性的js代码
2013/08/16 Javascript
删除节点的jquery代码
2014/01/13 Javascript
JavaScript实现文字与图片拖拽效果的方法
2015/02/16 Javascript
jQuery获得包含margin的outerWidth和outerHeight的方法
2015/03/25 Javascript
JS实现网页标题栏显示当前时间和日期的完整代码
2015/11/02 Javascript
jQuery中判断对象是否存在的方法汇总
2016/02/24 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
Angular.js 实现数字转换汉字实例代码
2016/07/14 Javascript
angularjs实现下拉列表的选中事件示例
2017/03/03 Javascript
详解webpack 配合babel 将es6转成es5 超简单实例
2017/05/02 Javascript
原生js实现移动端触摸轮播的示例代码
2017/12/22 Javascript
JavaScript作用域链实例详解
2019/01/21 Javascript
vue2.x 通过后端接口代理,获取qq音乐api的数据示例
2019/10/30 Javascript
JS常用排序方法实例代码解析
2020/03/03 Javascript
微信小程序scroll-view隐藏滚动条的方法详解
2020/03/25 Javascript
微信小程序间使用navigator跳转传值问题实例分析
2020/03/27 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
[03:59]5分钟带你了解什么是DOTA2(第二期)
2017/02/07 DOTA
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python中一些自然语言工具的使用的入门教程
2015/04/13 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
Django的models中on_delete参数详解
2019/07/16 Python
Python Http请求json解析库用法解析
2020/11/28 Python
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
金融专业个人的自我评价
2013/10/18 职场文书
主持人演讲稿
2014/05/13 职场文书
中国在我心中演讲稿
2014/09/13 职场文书
文化苦旅读书笔记
2015/06/29 职场文书
SpringBoot全局异常处理方案分享
2022/05/25 Java/Android