图像转GIF和MP4
# encoding:utf-8 from PIL import Image import os import moviepy.editor as mp import numpy as np import cv2 import logging logging.basicConfig(level=logging.WARNING, format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s:%(message)s', datefmt='%Y-%m-%d %H:%M:%S') class img2mp4(): # 图像转mp4, 思路是: picture -> gif -> mp4 def __init__(self, imgdir): self.imgdir = imgdir # 图像文件夹 def mkGIF(self, fnames, gfile, delta, X=1920, Y=1080): # 生成gif的函数,原始图片仅支持png # fnames: 图片 # gfile:生成的GIF文件名称 # delta: 每张图片之间的时间间隔 frames = [] order = 0 for img in fnames: img = Image.open(img) width, height = img.size padx = (X - width) // 2 pady = (Y - height) // 2 arr = np.zeros((Y, X, 3), dtype=np.int8) arr[pady:Y - pady, padx:X - padx, :] = np.array(img) # padding为统一大小 amg = Image.fromarray(arr.astype("uint8")) frames.append(amg) order += 1 frames[0].save(gfile, append_images=frames, save_all=1, duration=delta) return gfile def gif2Mp4(self, gif, mp4): # *.gif 转 *.mp4 clip = mp.VideoFileClip(gif) clip.write_videofile(mp4) def pic2mp4(self, mp4): source = [os.path.join(self.imgdir, _)for _ in os.listdir(self.imgdir)] gname = os.path.join(os.path.dirname(mp4), f"{os.path.basename(mp4).split('.')[0]}.gif") gfile = self.mkGIF(source, gname, duration=1/24) self.gif2Mp4(gfile, mp4) def video2pic(mp4, outdir): # 获得视频的格式 videoCapture = cv2.VideoCapture(mp4) # 读帧 success, frame = videoCapture.read() count = 1 while success: img = Image.fromarray(frame) outname = os.path.join(outdir, f"{10000+count}.png") img.save(outname) logging.warning(f"Writing picture {outname}") count += 1 success, frame = videoCapture.read() # 下一帧 videoCapture.release()