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实现bucket排序算法实例分析
May 04 Python
一步步解析Python斗牛游戏的概率
Feb 12 Python
简单讲解Python编程中namedtuple类的用法
Jun 21 Python
python+selenium实现163邮箱自动登陆的方法
Dec 31 Python
python 从csv读数据到mysql的实例
Jun 21 Python
python利用多种方式来统计词频(单词个数)
May 27 Python
python实现网站用户名密码自动登录功能
Aug 09 Python
python字典排序的方法
Oct 12 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
python三引号如何输入
Jul 06 Python
python文件路径操作方法总结
Dec 21 Python
Django使用channels + websocket打造在线聊天室
May 20 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中通过fopen()函数访问远程文件示例
2014/11/18 PHP
js获取网页高度(详细整理)
2012/12/28 Javascript
jquery简单瀑布流实现原理及ie8下测试代码
2013/01/23 Javascript
JS图片根据鼠标滚动延时加载的实例代码
2013/07/13 Javascript
jQuery的选择器中的通配符使用介绍
2014/03/20 Javascript
javascript中scrollTop详解
2015/04/13 Javascript
js表格排序实例分析(支持int,float,date,string四种数据类型)
2015/05/06 Javascript
JavaScript从数组的indexOf()深入之Object的Property机制
2016/05/11 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
微信 java 实现js-sdk 图片上传下载完整流程
2016/10/21 Javascript
根据输入邮箱号跳转到相应登录地址的解决方法
2016/12/13 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
使用AngularJS 跨站请求如何解决jsonp请求问题
2017/01/16 Javascript
Vue注册组件命名时不能用大写的原因浅析
2019/04/25 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
Vue2.X和Vue3.0数据响应原理变化的区别
2019/11/07 Javascript
[56:13]DOTA2-DPC中国联赛定级赛 LBZS vs Phoenix BO3第一场 1月10日
2021/03/11 DOTA
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Python Scrapy框架:通用爬虫之CrawlSpider用法简单示例
2020/04/11 Python
tensorflow pb to tflite 精度下降详解
2020/05/25 Python
Python 如何实现访问者模式
2020/07/28 Python
HTML5 video标签(播放器)学习笔记(一):使用入门
2015/04/24 HTML / CSS
带你认识HTML5中的WebSocket
2015/05/22 HTML / CSS
男女钓鱼靴和甲板鞋:XTRATUF
2021/01/09 全球购物
实现strstr功能,即在父串中寻找子串首次出现的位置
2016/08/05 面试题
电子商务专业自我鉴定
2013/12/18 职场文书
中专生自我鉴定书范文
2013/12/28 职场文书
新教师培训方案
2014/06/08 职场文书
民主生活会对照检查材料范文
2014/10/01 职场文书
市场调研项目授权委托书范本
2014/10/04 职场文书
初中教师个人总结
2015/02/10 职场文书
世界遗产导游词
2015/02/13 职场文书
学校通报表扬范文
2015/05/04 职场文书
2015年会计工作总结范文
2015/05/26 职场文书
用React Native制作一个简单的游戏引擎
2021/05/27 Javascript
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL