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 Queue模块详解
Nov 30 Python
Python2.7基于淘宝接口获取IP地址所在地理位置的方法【测试可用】
Jun 07 Python
利用python操作SQLite数据库及文件操作详解
Sep 22 Python
[原创]python爬虫(入门教程、视频教程)
Jan 08 Python
解决matplotlib库show()方法不显示图片的问题
May 24 Python
python3.6实现学生信息管理系统
Feb 21 Python
python把ipynb文件转换成pdf文件过程详解
Jul 09 Python
python用win32gui遍历窗口并设置窗口位置的方法
Jul 26 Python
python写一个随机点名软件的实例
Nov 28 Python
python argparse传入布尔参数false不生效的解决
Apr 20 Python
Python闭包及装饰器运行原理解析
Jun 17 Python
python 实现ping测试延迟的两种方法
Dec 10 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实现异步调用方法研究与分享
2011/10/27 PHP
PHP 使用pcntl和libevent 实现Timer功能
2013/10/27 PHP
微信公众平台消息接口校验与消息接口响应实例
2014/12/23 PHP
PHP实现非阻塞模式的方法分析
2018/07/26 PHP
javascript模拟的Ping效果代码 (Web Ping)
2011/03/13 Javascript
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
js使用ajax读博客rss示例
2014/05/06 Javascript
jquery中one()方法的用法实例
2015/01/16 Javascript
JavaScript6 let 新语法优势介绍
2016/07/15 Javascript
Input文本框随着输入内容多少自动延伸的实现
2017/02/15 Javascript
jQuery实现文章图片弹出放大效果
2017/04/06 jQuery
webpack下实现动态引入文件方法
2018/02/22 Javascript
Bootstrap模态对话框中显示动态内容的方法
2018/08/10 Javascript
angularjs下ng-repeat点击元素改变样式的实现方法
2018/09/12 Javascript
小程序实现抽奖动画
2020/04/16 Javascript
vue-cli项目使用mock数据的方法(借助express)
2019/04/15 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
Vue中rem与postcss-pxtorem的应用详解
2019/11/20 Javascript
vue3.0 上手体验
2020/09/21 Javascript
Vue中使用JsonView来展示Json树的实例代码
2020/11/16 Javascript
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[01:00:49]DOTA2-DPC中国联赛 正赛 Ehome vs iG BO3 第二场 1月31日
2021/03/11 DOTA
python操作xml文件详细介绍
2014/06/09 Python
Python中文件遍历的两种方法
2014/06/16 Python
Python算法应用实战之队列详解
2017/02/04 Python
python调用百度语音REST API
2018/08/30 Python
Python可变参数会自动填充前面的默认同名参数实例
2019/11/18 Python
python将音频进行变速的操作方法
2020/04/08 Python
CSS3教程(6):创建网站多列
2009/04/02 HTML / CSS
应届大学生自荐信格式
2013/09/21 职场文书
跟单业务员岗位职责
2014/03/08 职场文书
第一批党的群众路线教育实践活动总结报告
2014/07/03 职场文书
村道德模范事迹材料
2014/08/28 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
Docker与K8s关系介绍不会Docker也可以使用K8s
2022/06/25 Servers