python将照片集导出成视频

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 ImageSequenceClipdef 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%,则返回Noneif img.width < video_width * 0.5 or img.height < video_height * 0.5:return None# 计算目标缩放比例scale_x = video_width / img.widthscale_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) // 2top = (img.height - video_height) // 2right = left + video_widthbottom = top + video_height# 裁剪并返回最终图片img = img.crop((left, top, right, bottom))return imgdef 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一起,每天不一样!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/882602.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PC企业微信自动回复,群发管理,定时发送,朋友圈

服务提供了丰富的API和SDK&#xff0c;可以在企微的功能之上进行应用开发和功能扩展 自建应用可以调用企微hook或协议提供的接口来实现数据交互&#xff0c;可以直接调用hook或协议接口提供的功能来进行消息的发送与接收、用户管理、应用管理等操作&#xff0c;通过接口可以实…

滚雪球学Redis[7.0讲]:Redis在Web应用中的会话管理:实现、优化与安全性!

全文目录&#xff1a; ☁️前言⛅️1. 在Web应用中使用Redis管理会话&#x1f567;️1.1 什么是会话管理&#xff1f;&#x1f550;️1.2 为什么选择Redis来管理会话&#xff1f;&#x1f55c;️1.3 示例&#xff1a;使用Redis实现会话管理&#x1f551;️代码示例&#x1f55d…

Vue前端预览docx文档

Vue前端预览docx文档 实现效果 vue代码 <el-dialog title"预览" :visible.sync"filePreview"><div ref"file"></div></el-dialog>引入依赖文件 官方文档地址 https://www.npmjs.com/package/docx-preview?activeTabre…

MacOS安装BurpSuite

文章目录 一、下载地址二、下载注册机三、安装教程四、启动burpsuit五、免责声明 一、下载地址 https://portswigger-cdn.net/burp/releases/download?productpro&version2024.7.1&typeMacOsx二、下载注册机 https://github.com/NepoloHebo/BurpSuite-BurpLoaderKey…

Java 多线程进阶:常见的锁策略/synchronized原理/CAS(更新中)

一.常见的锁策略 锁:非常广义的话题; synchronized:只是市面上五花八门的锁的其中一种典型的实现,Java内置的推荐使用的锁; (1)乐观锁 && 悲观锁 乐观锁:加锁的时候,假设出现锁冲突的概率不大;接下来围绕加锁要做的工作很少; 悲观锁:加锁的时候,假设出现锁冲突的概…

数据库中存储树状关系的数据

三张表的文字描述 表1&#xff1a;包含字段A1,字段A2,字段A3. 字段A1是主键 表2&#xff1a;包含字段B1&#xff0c;字段B2&#xff0c;字段A1 字段B1是主键&#xff0c;字段A1是其外键。 1个字段A1的值可以匹配多条表2的记录. 表3&#xff1a;包含字段C1&#xff0c;字段C2&am…

下午题数据库设计15分

一、考什么 题目会给场景&#xff0c;和数据库的设计过程&#xff0c;让你补充残缺的E-R图&#xff0c;关系模式&#xff0c;找主键外键。还有1-2分的随机题型。 二、答题技巧 熟练基本知识结合题干 三、例题

【OD】【E卷】【真题】【200分】项目排期(PythonJavaJavaScriptC++C)

题目描述 项目组共有N个开发人员&#xff0c;项目经理接到了M个独立的需求&#xff0c;每个需求的工作量不同&#xff0c;且每个需求只能由一个开发人员独立完成&#xff0c;不能多人合作。假定各个需求直接无任何先后依赖关系&#xff0c;请设计算法帮助项目经理进行工作安排…

构建高效在线考试平台:Spring Boot与JavaWeb的融合

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理基于JavaWeb技术的在线考试系统设计与实现…

python图片文件路径排序

解决用sord 排序文件路径乱序问题&#xff1a; image_files 是 图片文件路径列表[pythonProject/video2img/1.jpg,pythonProject/video2img/2.jpg,.......] image_files.sort(keylambda x: int(x.split(/)[-1].split(.)[0]))

颜廷利:东方智慧的现代诠释者

人文公社 2024年10月21日 东方智者颜廷利, 哲学思想论古今, 和善互爱满天下, 无私奉献情意深… 在当代哲学与文化交融的浪潮中,颜廷利以其深邃的东方智慧和对古今思想的独到见解,成为了一位备受瞩目的思想家。他不仅倡导和谐共处、互爱互助的理念,更以自身的行动践行着无私…

Hi3061M——VL53L0X激光测距(IIC)(同样适用于其他MCU)2

目录 前言资源下载移植基本使用IO配置调用测量 总结 前言 昨晚太晚了&#xff0c;草草结束了上一篇&#xff0c;今天更新下半部分。 昨天已经讲了VL53L0X的使用流程&#xff0c;无非就是进行6步的效准初始化&#xff0c;然后配置下模式和时间&#xff0c;开始采样&#xff0c;…

Python-函数self详解

在Python中&#xff0c;self 是一个特殊的关键字&#xff0c;主要用于类&#xff08;class&#xff09;的定义中&#xff0c;表示类的实例&#xff08;instance&#xff09;本身。以下是对 self 的详细解释&#xff1a; 类和实例的概念&#xff1a; 类&#xff08;Class&#…

Yolov10训练的餐盘菜品目标检测软件(包含源码及数据集)

本文摘要 摘要&#xff1a;本文主要使用YOLOV10深度学习框架自训练了一个“餐盘菜品目标检测模型”&#xff0c;基于此模型使用PYQT5实现了一款界面软件用于功能演示。让您可以更好的了解和学习&#xff0c;该软件支持图片、视频以及摄像头进行目标检测&#xff0c;本系统所涉…

【python】OpenCV—Fun Mirrors

文章目录 1、准备工作2、原理介绍3、代码实现4、效果展示5、参考 1、准备工作 pip install vacm2、原理介绍 在OpenCV中&#xff0c;VCAM 库是一个用于简化创建三维曲面、定义虚拟摄像机、设置参数以及进行投影任务的工具。它特别适用于实现如哈哈镜等图像变形效果。 一、VC…

AI自动生成PPT哪个软件好?智能生成PPT不再熬夜做课件

大概这世上&#xff0c;都是职场牛马对“PPT”这三个字母的头痛反应最大吧&#xff01; 是的&#xff0c;就连各个年级段的老师也是很头痛——愁着怎样能在排版整齐的情况下&#xff0c;将必考知识点都呈现在PPT每一张幻灯片页面里...... 近期打听到用人工智能生成ppt课件&am…

React 项目热更新失效问题的解决方案和产生的原因

背景和意义 在修复React项目热更新失效的问题时&#xff0c;经过一系列问题排查和依赖升级&#xff0c;最终成功修复了问题并为后续开发规避了类似的问题。 依赖升级 Vite版本升级 原React项目Vite版本升级到^4.4.5 Vite 4 在构建和开发服务器的性能上进行了优化&#xff…

R01 vue+springboot 高考志愿推荐AI问答大数据平台

可以查看本文系统对应的视频讲解&#xff1a; vuespringboot 高考推荐AI问答志愿推荐大数据 R01 带增删改查、大屏、支持爬虫 1 系统背景 近年来&#xff0c;高考作为中国教育体系中最重要的考试之一&#xff0c;承载了无数考生和家庭的梦想。随着信息技术的迅猛发展&#xff…

class GenericRow(protected[sql] val values: Array[Any]) extends Row

class GenericRow(protected[sql] val values: Array[Any]) extends Row 是 Scala 语言中的一行代码&#xff0c;定义了一个名为 GenericRow 的类&#xff0c;它继承自 Row 类。下面是这行代码的详细解释&#xff1a; 组件解析 class GenericRow: 这是类的定义&#xff0c;类名…

如何用bat脚本修改windows环境下jenkins服务的登陆密码

在Windows系统下&#xff0c;你可以使用批处理文件&#xff08;.bat&#xff09;来修改Jenkins服务的登录密码。但请注意&#xff0c;这通常涉及到对Windows服务的配置&#xff0c;并且需要管理员权限。 以下是一个基本的步骤和示例脚本&#xff0c;用于修改Jenkins服务的登录…