转载请注明作者和出处: http://blog.csdn.net/john_bh/
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")