python、ffmpeg读取GIF图并存帧

其实提取并保存帧并不难。
最初目的是提取帧,并对帧进行缩放,由于只熟悉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 …

结果如下图:
python、ffmpeg读取GIF图并存帧_第1张图片


生成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是每一帧时长

你可能感兴趣的:(python,opencv,图像处理)