python将照片集变成视频

简介: `shigen`是一位坚持更新文章的博客作者,记录成长历程,分享认知见解,留住生活感动。他利用Python库`Pillow`和`MoviePy`开发了一个工具,能够批量处理照片并生成高质量视频。该工具支持多种分辨率、自定义播放时间和照片方向,并能自动调整照片比例以实现居中对齐。通过简单的代码实现了照片视频化的需求,适合强迫症患者使用。**与shigen一起,每天不一样!**个人IP:shigen。

shigen坚持更新文章的博客写手,记录成长,分享认知,留住感动。个人IP:shigen

背景

一个安静的下午,看着电脑里乱七八糟的照片,有大有小,宽高不一,突然想找个方式把他们统一起来,然后做成视频更好(其实我在上高中的时候就喜欢把照片做成视频,觉得意义很大)。要满足批量、自动化,肯定得动用代码了。于是首先我列举了下我希望的功能:

  1. 照片来源:制定的目录下所有的文件格式为照片的文件,按照照片的文件名进行排序
  2. 照片质量:按照目前的720P、1080P、甚至是2K、4K的画质来生成照片视频
  3. 照片横竖:可以自定义指定照片是横屏还是竖屏
  4. 照片时间:可以自定义每一张照片的放映时间
  5. 照片比例:这个也是最为重要的,对此我分成了如下几种case:
    1. 图片的宽度 < 视频宽度 50% or 图片的高度 < 视频高度 50%:舍弃掉
    2. 图片宽度 < 视频宽度 or 图片的高度 < 视频高度:居中等比放大,直到高度 = 视频高度 or 宽度 = 视频宽度=
    3. 其它尺寸,图片居中等比缩小,直到高度 = 视频高度 or 宽度 = 视频宽度

这种照片比例的放大居中,基本上是强迫症患者的福音了,严格的居中对齐。

实现

依托强大的python库,这里主要用到的工具库有:

  1. Pillow,源代码有简单、精炼的解释:Pillow is the friendly PIL fork by Alex Clark and Contributors.PIL is the Python Imaging Library by Fredrik Lundh and Contributors.机器学习、图像识别等场景用到的最多,这里主要使用它来调整图片的大小
  2. MoviePy, 是一个用于视频编辑的 Python 库。可以剪辑视频添加音频和字幕调整视频帧简单的特效等等。这里主要是根据照片序列生成视频。

介绍完主要的库之后,就是代码环节了,代码里注释较多,轻松入手,不做过多的解释:

# create viode from a dictionary which contains image or video files
import os
from PIL import Image
from moviepy.editor import ImageSequenceClip


def resize_and_crop(image, target_size):
    """将图片根据给定的大小进行缩放和裁剪

    1. 图片的宽度 < 视频宽度 * 50% or 图片的高度 < 视频高度 * 50%:舍弃掉
    2. 图片宽度 < 视频宽度 or 图片的高度 < 视频高度:居中等比放大,直到高度 = 视频高度 or 宽度 = 视频宽度
    3. 图片居中等比缩小,直到高度 = 视频高度 or 宽度 = 视频宽度

    Args:
        image (str): 原图片文件路径
        target_size (tuple): 视频大小(宽度, 高度)

    Returns:
        Image: 调整后的图片,可能为空
    """
    img = Image.open(image)
    video_width, video_height = target_size

    # 检查条件1:如果原图宽度或高度小于视频尺寸的50%,则返回None
    if img.width < video_width * 0.5 or img.height < video_height * 0.5:
        return None

    # 计算目标缩放比例
    scale_x = video_width / img.width
    scale_y = video_height / img.height

    # 根据需要的宽度和高度选择缩放比例
    if img.width < video_width or img.height < video_height:
        # 居中等比放大
        scale = max(scale_x, scale_y)
    else:
        # 居中等比缩小
        scale = min(scale_x, scale_y)

    # 放大或缩小图片
    new_size = (int(img.width * scale), int(img.height * scale))
    img = img.resize(new_size, Image.ANTIALIAS)

    # 计算裁剪框的位置
    left = (img.width - video_width) // 2
    top = (img.height - video_height) // 2
    right = left + video_width
    bottom = top + video_height

    # 裁剪并返回最终图片
    img = img.crop((left, top, right, bottom))
    return img


def create_video_from_images(folder_path,
                             out_put_file_name='output_video.mp4',
                             resolution='720p',
                             is_horizontal=True,
                             duration=3):
    """通过照片生成视频

    Args:
        folder_path (_type_): 文件夹路径
        out_put_file_name (str, optional): _description_. 视频输出路径 Defaults to 'output_video.mp4'.
        resolution (str, optional): _description_. 视频清晰度 Defaults to '720p'.
        is_horizontal (bool, optional): _description_. 是否是横屏 Defaults to True.
        duration (int, optional): _description_. 每张照片的放映时长 Defaults to 3.

    Raises:
        ValueError: 视频清晰度错误
    """
    resolution_mapping = {
   
        '720p': (1280, 720),
        '1080p': (1920, 1080),
        '2k': (2560, 1440),
        '4k': (3840, 2160),
    }

    if resolution not in resolution_mapping:
        raise ValueError(
            "Invalid resolution. Choose from '720p', '1080p', '2k', '4k'.")

    target_size = resolution_mapping[resolution]
    if not is_horizontal:
        target_size = (target_size[1], target_size[0])

    images = []

    # 读取文件夹下的文件并按照文件名排序
    for filename in sorted(os.listdir(folder_path)):
        if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
            img = resize_and_crop(os.path.join(folder_path, filename),
                                  target_size)
            if img:
                images.append(img)

    # 照片的临时位置
    temp_files = []
    for i, img in enumerate(images):
        temp_file = f'temp_image_{i}.png'
        img.save(temp_file)
        temp_files.append(temp_file)

    # 创建视频
    clip = ImageSequenceClip(temp_files, fps=1 / duration)
    output_file = os.path.join(folder_path, out_put_file_name)
    clip.write_videofile(output_file, codec='libx264')

    # 清除临时文件
    for temp_file in temp_files:
        os.remove(temp_file)


if __name__ == '__main__':
    create_video_from_images(
        folder_path='/Users/xxxx/Downloads/xxx/imgs',
        is_horizontal=False,
        resolution='720p')

我们执行脚本,这里是控制台输出:

控制台输出

再来看看视频输出:

生成的视频

标准的720P H264编码,3&,21s的时长。有一张图是横屏的图,这里生成的视频中也根据高度放大进行了居中裁剪:

图片居中裁剪

整体的感觉还不错,特此写个博客分享出来。当然还有很多的优化点:

优化项

其实做的还是相当的粗糙,但是基本上还是省事儿了。考虑到的优化点有:

  1. 指定背景音乐并实现照片卡点
  2. 加上随机的特效切换

咳,目前想到的就这么多。作为工具,我觉得越简单越好,需要效率和我开发时间的权衡。

与shigen一起,每天不一样!

目录
相关文章
|
3月前
|
Web App开发 安全 数据安全/隐私保护
利用Python+Requests实现抖音无水印视频下载
利用Python+Requests实现抖音无水印视频下载
|
3月前
|
编解码 数据安全/隐私保护 Python
抖音批量发布视频工具,自动上传视频作品笔记,python发布软件
这个抖音批量发布工具包含三个主要模块:主上传程序、配置文件和视频预处理工具。主程序
|
10天前
|
数据采集 自然语言处理 数据可视化
Python爬取B站视频评论区情感分析:从数据采集到价值挖掘
B站作为年轻人聚集地,评论蕴含丰富情感与趋势。本文详解如何用Python爬取评论,结合SnowNLP与jieba进行中文情感分析,并通过可视化挖掘用户情绪、消费意愿与内容反馈,助力精准运营与决策。
91 0
|
4月前
|
数据采集 机器学习/深度学习 编解码
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
本文详细介绍了一个简化版 Veo 3 文本到视频生成模型的构建过程。首先进行了数据预处理,涵盖了去重、不安全内容过滤、质量合规性检查以及数据标注等环节。
313 5
从零复现Google Veo 3:从数据预处理到视频生成的完整Python代码实现指南
|
3月前
|
API 数据安全/隐私保护 Python
小红书批量发布协议, 抖音自动批量发布软件脚本,笔记作品视频自动发布工具【python】
这个工具框架包含了小红书和抖音的批量发布功能,支持图片和视频处理、定时发布等功能
|
3月前
|
Web App开发 数据安全/隐私保护 Python
快手批量发布作品工具,自动上传视频发布软件,python实现自动脚本
这个脚本实现了快手批量上传视频的功能,包含登录、上传视频、添加描述和发布等完整流程
|
3月前
|
数据安全/隐私保护 Python
快手自动上传视频脚本,图文视频批量发布工具,快手批量发布作品软件【python】
快手批量上传工具提供了完整的视频和图文上传功能,包含登录验证、文件上传、标题设置
|
3月前
|
Web App开发 数据安全/隐私保护 Python
抖音快手小红书哔哩哔哩,批量发布作品笔记视频工具,自动发布作品上传笔记视频【python】
这个工具实现了四大平台的视频批量上传功能,包含完整的异常处理和日志记录。使用时需要配置
|
3月前
|
JSON API 数据安全/隐私保护
批量上传发布视频的软件,小红书抖音快手哔哩哔哩,自动发布上传作品工具【python】
这个项目包含完整的视频批量上传功能,支持多个平台,包含视频处理、配置管理和错误处理等功能
|
7月前
|
前端开发 JavaScript 关系型数据库
基于Python+Vue开发的反诈视频宣传管理系统源码+运行步骤
基于Python+Vue开发的反诈视频宣传管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Python编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Python的反诈宣传管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
108 6

推荐镜像

更多