其实提取并保存帧并不难。
最初目的是提取帧,并对帧进行缩放,由于只熟悉cv2对图像进行操作,所以必须要用numpy类型的图片。PIL转numpy会变灰度图,不知为什么只能放弃,采用了imageio库。
后面又发现了opencv可以直接读gif的方法。。。。。。。
方法0: 采用PIL库读取GIF后转cv2的numpy类型图片变灰度图,原因未知,放弃。
方法一: imageio库 (包含imageio转cv2)
import numpy as np
import cv2
import imageio
frames=imageio.mimread('a.gif') #frames是一个列表,存储gif里面的每一帧,长度就是帧个数
print(len(frames)) %imageio的图片类型为imageio.core.util.Array
cv_img=[]
for f in frames: #把每一帧转为numpy
i = cv2.cvtColor(np.array(f),cv2.COLOR_RGB2BGR)
cv_img.append(i)
for c in cv_img:#显示
cv2.imshow('1',c)
cv2.waitKey(50)
cv2.imwrite('{}.jpg'.format(i),frame) %生成图片名为 1.jpg 2.jpg ...
i+=1
方法二: 后续发现,和读视频方法一样
x=cv2.VideoCapture('a.gif')
i=1
while(1):
ret,frame=x.read()
if ret==True:
cv2.imshow('1',frame)
cv2.waitKey(50)
cv2.imwrite('{}.jpg'.format(i),frame) %生成图片名为 1.jpg 2.jpg ...
i+=1
方法三: 采用ffmpeg,windows linux均可以。很方便,但仅限于提取,无法对帧进行后续操作。
ffmpeg安装方法可参考:https://blog.csdn.net/polyhedronx/article/details/81947539
ffmpeg -i a.gif img_%d.jpg
若是%d.jpg,生成图片名为 1.jpg 2.jpg …
若是new/%d.jpg,需手动在当前目录创个new文件夹,帧会存在new文件夹内。生成图片名为 1.jpg 2.jpg …
若是img_%d.jpg,生成图片名为 img_1.jpg img_2.jpg …
若是img_%4d.jpg,生成图片名为 img_0001.jpg img_0002.jpg …
结果如下图:
生成gif图并保存
imgs=[]
for i in range(1,75):
x=imageio.imread('img_{}.jpg'.format(i))
imgs.append(x) #将所有图存进列表里
imageio.mimsave('a.gif',imgs,'GIF',duration=0.05) #duration是每一帧时长