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多进程并发(multiprocessing)用法实例详解
Jun 02 Python
python的paramiko模块实现远程控制和传输示例
Oct 13 Python
浅谈Series和DataFrame中的sort_index方法
Jun 07 Python
python将txt文件读入为np.array的方法
Oct 30 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
python将pandas datarame保存为txt文件的实例
Feb 12 Python
python抓取搜狗微信公众号文章
Apr 01 Python
浅谈Python中函数的定义及其调用方法
Jul 19 Python
详解Python中namedtuple的使用
Apr 27 Python
Django REST 异常处理详解
Jul 15 Python
一篇文章弄懂Python中的内建函数
Aug 07 Python
Python编程编写完善的命令行工具
Sep 15 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
盘点被央视点名过的日本动画电影 一部比一部强
2020/03/08 日漫
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
PHP无法访问远程mysql的问题分析及解决
2013/05/16 PHP
PHP Cookie的使用教程详解
2013/06/03 PHP
解析将多维数组转换为支持curl提交的一维数组格式
2013/07/08 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
php实现12306余票查询、价格查询示例
2014/04/17 PHP
PHP CURL采集百度搜寻结果图片不显示问题的解决方法
2017/02/03 PHP
用JavaScript页面不刷新时全选择,全删除(GridView)
2009/04/14 Javascript
jquery定时滑出可最小化的底部提示层特效代码
2013/10/02 Javascript
JS简单计算器实例
2015/01/20 Javascript
原生JS实现仿淘宝网左侧商品分类菜单效果代码
2015/09/10 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
vue-music 使用better-scroll遇到轮播图不能自动轮播问题
2018/12/03 Javascript
jQuery时间戳和日期相互转换操作示例
2018/12/07 jQuery
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
一百多行python代码实现抢票助手
2018/09/25 Python
Linux下远程连接Jupyter+pyspark部署教程
2019/06/21 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
Python qqbot 实现qq机器人的示例代码
2019/07/11 Python
new_zeros() pytorch版本的转换方式
2020/02/18 Python
Python浮点型(float)运算结果不正确的解决方案
2020/09/22 Python
Selenium Webdriver元素定位的八种常用方式(小结)
2021/01/13 Python
盖尔斯工厂店:GUESS Factory
2020/01/21 全球购物
英国最受欢迎的母婴精品品牌:JoJo Maman BéBé
2021/02/17 全球购物
nohup的用法
2014/08/10 面试题
三严三实对照检查材料思想汇报
2014/09/28 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
个人先进材料范文
2014/12/30 职场文书
成本会计岗位职责
2015/02/03 职场文书
2015中秋节晚会开场白
2015/07/30 职场文书
聘用合同范本
2015/09/21 职场文书
pycharm 如何查看某一函数源码的快捷键
2021/05/12 Python
MySQL数据库完全卸载的方法
2022/03/03 MySQL