python生成 Gif 方法汇总

转载请注明作者和出处: http://blog.csdn.net/john_bh/

文章目录

    • 1. 使用 PIL 和 images2gif 库
    • 2. 使用 imageio 库
      • 2.1 图片生成 Gif
      • 2.2 视频生成 Gif

1. 使用 PIL 和 images2gif 库

# -*- coding:utf-8 -*-

from PIL import Image 
from images2gif import writeGif
outfilename = "my.gif" # 转化的GIF图片名称           
filenames = []         # 存储所需要读取的图片名称
for i in range(100):   # 读取100张图片
    filename = path    # path是图片所在文件,最后filename的名字必须是存在的图片 
    filenames.append(filename)              # 将使用的读取图片汇总
frames = []
for image_name in filenames:                # 索引各自目录
    im = Image.open(image_name)             # 将图片打开,本文图片读取的结果是RGBA格式,如果直接读取的RGB则不需要下面那一步
    im = im.convert("RGB")                  # 通过convert将RGBA格式转化为RGB格式,以便后续处理 
    im = np.array(im)                       # im还不是数组格式,通过此方法将im转化为数组
    frames.append(im)                       # 批量化
writeGif(outfilename, frames, duration=0.1, subRectangles=False) # 生成GIF,其中durantion是延迟,这里是1ms

2. 使用 imageio 库

2.1 图片生成 Gif

# -*- coding:utf-8 -*-

import imageio

outfilename = "my.gif" # 转化的GIF图片名称
filenames = []
for i in range(100):
    filename = path
    filenames.append(filename)
frames = []
for image_name in filenames:
    im = imageio.read(image_name)  # 读取方式上存在略微区别,由于是直接读取数据,并不需要后续处理
    frames.append(im)
imageio.mimsave(outfilename, frames, 'GIF', duration=0.1) # 生成方式也差不多

2.2 视频生成 Gif

# -*- coding:utf-8 -*-

import cv2
import os
import imageio
import shutil

def extract_image_from_video(video_path_name, img_dir, cap_fps):
    '''
    从视频中提取图片
    :param video_path_name: 视频文件全路径
    :param img_dir: 截图存放文件夹路径
    :param cap_fps: 每秒截图数量
    :return:
    '''
    # 创建文件夹用于保存从video中提取的图像
    if not os.path.exists(img_dir):
        os.mkdir(img_dir)
    else:
        shutil.rmtree(img_dir)
        os.makedirs(img_dir)

    cap = cv2.VideoCapture(video_path_name)  # 打开视频文件
    # 视频文件的一些信息(name,fps,size)
    video_name = ''.join(video_path_name.split('\\')[-1].split('.')[:-1])
    fps = cap.get(cv2.CAP_PROP_FPS)
    size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
    print('Video info : ', {'name': video_name, 'fps': fps, 'size': size})

    temp = fps // cap_fps  # 根据每秒视频提取图片数计算何时保存视频文件
    frame_nb = 1  # 当前视频帧数
    while (cap.isOpened()):
        ret, frame = cap.read()
        if ret == True:
            # 以下被注释语句用于显示视频
            # cv2.imshow('frame', frame)
            if frame_nb % temp == 0:
                # 保存视频当前帧, 文件名应按字符大小升序保存
                cv2.imwrite(img_dir +"\\" + video_name + '%3d.png' % frame_nb, frame)
        else:
            break
        frame_nb += 1

    cap.release()
    cv2.destroyAllWindows()

def make_gif(img_dir,gif_name='new.gif', duration=0.3):
    '''
    通过截图得到 *.gif文件
    :param gif_name: 存放gif文件全路径
    :param duration: gif中每一张图片(每一帧)持续时间
    :return:
    '''
    image_list = [img_dir +"\\" + img_name for img_name in os.listdir(img_dir)]
    frames = []
    for image_name in image_list:
        frames.append(imageio.imread(image_name))

    imageio.mimsave(gif_name, frames, 'GIF', duration=duration)

if __name__ == '__main__':
    video_path_name = r'demo.mp4'
    img_dir=r'img'
    cap_fps=2
    extract_image_from_video(video_path_name,img_dir,cap_fps)
    make_gif(img_dir=img_dir)
    print("OK")

你可能感兴趣的:(Python)