前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >GIF 动图的分解与合成

GIF 动图的分解与合成

作者头像
用户6021899
发布2019-09-29 17:04:46
1.5K0
发布2019-09-29 17:04:46
举报

GIF 动图的分解可以利用 PIL模块的Image类来实现。下面的自定义函数可以将一张GIF动图分解到指定文件夹:

代码语言:javascript
复制
from PIL import Image
import os

def gifSplit(gif_path, save_path, suffix="png"):
    img = Image.open(gif_path)
    for i in range(img.n_frames):
        img.seek(i)
        new = Image.new("RGBA", img.size)
        new.paste(img)
        new.save(os.path.join(save_path, "%d.%s" %(i, suffix)))

将上述函数改成下面的生成器,可以将GIF动图迭代输出成numpy数组供OpenCV模块调用。

代码语言:javascript
复制
def gifSplit2Array(gif_path, save_path):
    import numpy as np
    img = Image.open(gif_path)
    for i in range(img.n_frames):
        img.seek(i)
        new = Image.new("RGBA", img.size)              
        new.paste(img)
        arr = np.array(new).astype(np.uint8)  # image: img (PIL Image):
        yield arr[:,:,2::-1] # 逆序(RGB 转BGR), 舍弃alpha通道, 输出数组供openCV使用
代码语言:javascript
复制
import cv2
for img in gifSplit2Array("drop.gif", r"./gif splited"):
    cv2.imshow("gif", img)
    cv2.waitKey(40) #加入延迟

撒水成冰:

利用imageio模块很容易就能实现GIF动图的合成:

代码语言:javascript
复制
def create_gif(imagesPath, gif_name, duration=0.3, reverse =False):
    import imageio
    fileNames = os.listdir(imagesPath)
    frames = [] #列表,用于存储各个帧
    fileList = os.listdir(imagesPath)
    if reverse: fileList.sort(reverse=True)
    for file in fileList:
        fullpath = os.path.join(imagesPath, file)
        frames.append(imageio.imread(fullpath))#添加帧数据
    imageio.mimsave(gif_name, frames, 'GIF', duration=duration)#合成

上述自定义函数中,将关键字参数reverse 设为True,还可以实现倒序播放:

代码语言:javascript
复制
 create_gif(r"./gif splited","merged.gif", duration =0.3, reverse = True)

覆水可收:

上面提到的PIL和 imageio模块都可以用pip在线安装。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python可视化编程机器学习OpenCV 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档