微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 将图片合成视频

本文记录使用opencv-python库将以数字命名的图片合成视频的程序:

import os

from PIL import Image
import cv2


def charts2video(img_path, video_path):
    """将给定目录下的图片转成视频

    Args:
        img_path: 图片路径
        video_path: 输出视频的路径和名称

    Returns: 图片转成的视频
    来源: 参考博客https://www.cnblogs.com/willwuss/p/12695963.html
    """
    images = os.listdir(img_path)
    images.sort(key=lambda x: int(x[:-4]))  # 以名称字符串的数字从小到大排序  
    fps = 6  # 帧数
    fourcc = cv2.VideoWriter_fourcc(*"MJPG")

    im = Image.open(img_path + images[0])
    video_writer = cv2.VideoWriter(video_path, fourcc, fps, im.size)
    for img_i in images:
        frame = cv2.imread(img_path + img_i)
        print('开始将 ' + img_i + ' 加入视频\n')
        video_writer.write(frame)  # 注意:图片尺寸必须和视频尺寸一样,不然不会被加入视频中!!!
    video_writer.release()

只需要输入图片路径(例如,imgPath = “./figures/”)和视频路径与名称(如,videoPath = “./test.avi”)就可以调用上面的程序将图片连接成视频。需要注意的是图片尺寸需要一致,不然会跳过尺寸不一致的图片。先下面的程序可以更改图片尺寸

import os
import os.path
from PIL import Image
from typing import Tuple


def resize_image(img_in: str, img_out: str, img_size: Tuple[int, int], save_format: str) -> None:
    """
    判断图片尺寸,与给定尺寸不一致更改为指定尺寸,与给定尺寸一致时不进行操作。

    Args:
        img_in (str): 输入图片路径和名称
        img_out (str):  输出图片路径和名称
        img_size (tuple[int, int]): 输出图片像素宽度和像素高度
        save_format (str): 输出图片类型(png, gif, jpeg...)

    Returns:
        None: 无返回值,程序操作了文件
    """
    img = Image.open(img_in)

    img_size_init = img.size
    if img_size_init != img_size:    # 判断图片尺寸是否需要修改
        print(f'图片{img_in}初始尺寸为{img_size_init},被更改为{img_size}\n')
        out = img.resize(img_size, Image.ANTIALIAS)  # resize image with high-quality
        out.save(img_out, save_format)

    return None


def resize_img_in_dir(img_path, output_path, img_size, save_format):
    """
    更改文件夹中图片的尺寸,以相同的名称存到给定文件夹

    Args:
        img_path: 输入图片路径
        output_path: 输出图片路径
        img_size: 输出图片宽度和高度
        save_format: 输出图片类型(png, gif, jpeg...)
    """
    images = os.listdir(img_path)  # 获取文件夹中所有图片名称
    images.sort(key=lambda x: int(x[:-4]))  # 以名称字符串的数字从小到大排序 

    # 修改图片尺寸
    for img_i in images:
        resize_image(img_path+img_i, output_path+img_i, img_size, save_format)

    return None

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐