python、ffmpeg读取GIF图并存帧

11 篇文章 0 订阅
4 篇文章 1 订阅

其实提取并保存帧并不难。
最初目的是提取帧,并对帧进行缩放,由于只熟悉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是每一帧时长
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值