中年大叔学编程-Python将视频/图片互转

  • Post by eyiadmin
  • May 22, 2020
post-thumb

这次我们来做一件有意思的事情,把视频转成图片,再把图片转为视频。

在开始之前,我们先准备一个十几秒的短视频吧,可以自己拍,也可以自己剪切,接下来,安装一个两个组件:

  • 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中有很多有趣的库来帮我们简化一下复杂的操作,希望我们在学习过程中能深入挖掘更多有趣、强大的类库。

我只是记录我的学习过程,由于书读的少,可能很多地方表述或者是理解得不对,请轻喷并指正。

LATEST POST
  • Post By eyiadmin
  • Apr 18, 2021
.NET5快速接入支付宝扫码支付
  • Post By eyiadmin
  • Apr 18, 2021
uView练手开发-开发一个图片小程序
TAG
CATEGORIES