图像转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()

  

posted @ 2022-04-07 16:10  ddzhen  阅读(120)  评论(0编辑  收藏  举报