• 技术文章 >后端开发 >Python教程

    Python处理gif动态图的解析与合成操作的介绍

    不言不言2018-12-31 09:24:27转载2336
    本篇文章给大家带来的内容是关于Python处理gif动态图的解析与合成操作的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

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

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

    一、gif动态图的合成

    如下图,是一个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张相同分辨率的静态图组合而成

    二、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动态图的解析与合成操作的介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:脚本之家,如有侵犯,请联系admin@php.cn删除
    上一篇:python装饰器是什么?怎么用? 下一篇:Python中切片的详细介绍
    千万级数据并发解决方案

    相关文章推荐

    • python图像处理之镜像实现方法• Python图像灰度变换及图像数组操作• python图像处理之反色实现方法• python图像文字识别• Python图像灰度变换及图像数组操作方法• Python图像入门教程:Python图像入门教程推荐• python图像处理的基础和OpenCV的入门函数
    1/1

    PHP中文网