这次我们来做一件有意思的事情,把视频转成图片,再把图片转为视频。
在开始之前,我们先准备一个十几秒的短视频吧,可以自己拍,也可以自己剪切,接下来,安装一个两个组件:
imageio
opencv-python
视频转图片
from cv2 import cv2
cap = cv2.VideoCapture("D:/demo.mp4") #打开视频文件
ret = cap.isOpened() # 是否成功打开
frame_count = 0
while ret:
frame_count += 1
ret, frame = cap.read() # 按帧读取视频,第一个返回值表示是否正确读取,第二个返回值是当前帧的图片
if ret :
cv2.imwrite('F:/pic/%d.png' % frame_count, frame)
cap.release() #释放视频
图片转视频
from cv2 import cv2
import os
imglist = os.listdir('F:/pic/')
fps = 24 #视频每秒24帧
size = (1284, 720) #需要转为视频的图片的尺寸
video = cv2.VideoWriter("png.avi", cv2.VideoWriter_fourcc('I', '4', '2', '0'), fps, size)
for img in imglist:
tempimg = cv2.imread('F:/pic/%s'%img)
video.write(tempimg)
video.release()
图片转GIF动态图片
将图片转成GIF的话,我们需要借助imageio这个组件,将图片转换为每秒多帧播放的GIF图片
import imageio
import os
imglist = os.listdir('F:/pic/')
frames = []
for img in imglist:
frames.append(imageio.imread('F:/pic/%s'%img)) # 组装图片
imageio.mimsave('movie.gif', frames, 'GIF') #保存为gif图片
GIF图片转PNG图片
from PIL import Image
import os
im = Image.open('movie.gif')
while True:
img = im.tell() # 获取当前帧索引
im.save('F:/pic1/'+str(img)+'.png') #保存当前图片
if img>=im.n_frames-1:
break
im.seek(img+1) #获取下一帧的图片
print('解析完成')
我理解的视频和gif都是通过N多张图片在每秒插入的图片帧来形成的,所以这里简单的练习了一下视频转图片、图片转gif的功能,其实在python中有很多有趣的库来帮我们简化一下复杂的操作,希望我们在学习过程中能深入挖掘更多有趣、强大的类库。
我只是记录我的学习过程,由于书读的少,可能很多地方表述或者是理解得不对,请轻喷并指正。
领取专属 10元无门槛券
私享最新 技术干货