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的urllib库提交WEB表单
Feb 24 Python
举例区分Python中的浅复制与深复制
Jul 02 Python
PyQt5 窗口切换与自定义对话框的实例
Jun 20 Python
Python字符串对象实现原理详解
Jul 01 Python
Python使用APScheduler实现定时任务过程解析
Sep 11 Python
python sqlite的Row对象操作示例
Sep 11 Python
python中如何实现将数据分成训练集与测试集的方法
Sep 13 Python
python设置代理和添加镜像源的方法
Feb 14 Python
如何使用python传入不确定个数参数
Feb 18 Python
python利用opencv实现SIFT特征提取与匹配
Mar 05 Python
Python远程方法调用实现过程解析
Jul 28 Python
详解Python自动化之文件自动化处理
Jun 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
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
2010/03/27 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
Laravel 使用查询构造器配合原生sql语句查询的例子
2019/10/12 PHP
短信提示使用 特效
2007/01/19 Javascript
javascript prototype原型操作笔记
2009/12/07 Javascript
Javascript读取cookie函数代码
2010/10/16 Javascript
jquery attr 设定src中含有&(宏)符号问题的解决方法
2011/07/26 Javascript
JavaScript的作用域和块级作用域概念理解
2014/09/21 Javascript
JS限制文本框只能输入数字和字母方法
2015/02/28 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
JQuery常见节点操作实例分析
2019/05/15 jQuery
Vue移动端项目实现使用手机预览调试操作
2020/07/18 Javascript
Javascript中window.name属性详解
2020/11/19 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
Vue 简单实现前端权限控制的示例
2020/12/25 Vue.js
python实现百度关键词排名查询
2014/03/30 Python
Python理解递归的方法总结
2019/01/28 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
图文详解Django使用Pycharm连接MySQL数据库
2019/08/09 Python
解决python3 安装不了PIL的问题
2019/08/16 Python
基于Python实现ComicReaper漫画自动爬取脚本过程解析
2019/11/11 Python
Python趣味实例,实现一个简单的抽奖刮刮卡
2020/07/18 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
卡西欧B级产品官方网站:Casio Outlet
2018/05/22 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
货代行业个人求职简历的自我评价
2013/10/22 职场文书
大学在校生求职信范文
2013/11/21 职场文书
2015年公路养护工作总结
2015/05/13 职场文书
职工宿舍管理制度
2015/08/05 职场文书
幼儿园国培研修日志
2015/11/13 职场文书
导游词之南京莫愁湖公园
2019/11/13 职场文书
动画电影《龙珠超 超级英雄》延期上映
2022/03/20 日漫
TV动画《间谍过家家》公开PV
2022/03/20 日漫
Go语言grpc和protobuf
2022/04/13 Golang