零基础Python开发「图片批量转MP4视频」工具,本地离线、免费无水印

零基础Python开发「图片批量转MP4视频」工具,本地离线、免费无水印!

做自媒体、剪辑视频、制作数字人素材、相册宣传片的朋友,大概率都遇到过这个痛点:

一堆高清图片,想要合成连贯的MP4视频,网上工具要么强制加水印 、要么限制分辨率、要么需要付费会员,批量处理还得开VIP。

今天教大家用 30行左右Python代码 ,手写一个免费、无水印、本地离线、批量转换的图片转视频工具。

支持自定义帧率、分辨率、自动排序、批量合成,写完一次,终身免费使用,还能搭配HeyGen数字人、开源TTS配音做完整AI视频!

📑 文章目录


🔥 工具核心优势(吊打在线工具)

  • 完全免费:无会员、无水印、无次数限制

  • 本地离线运行:不上传图片,保护隐私素材

  • 自定义参数:自由设置帧率、视频分辨率、图片单帧时长

  • 全自动批量处理:自动读取文件夹所有图片,智能排序

  • 格式兼容全:支持 jpg、jpeg、png、bmp 常见图片格式

  • 画质无损:原生合成,不压缩模糊画质


🛠 开发依赖环境

我们核心用到两个Python库:

  • opencv-python:专业视频合成、图像读取处理

  • os:Python内置库,读取文件夹图片、遍历文件

打开终端,一键安装依赖:

bash 复制代码
pip install opencv-python

💻 完整可运行源码(新增转场+分辨率适配)

本次升级版新增核心功能:自动统一1080P分辨率、智能黑边填充(无拉伸变形)、全局淡入淡出转场、首尾渐变开场结尾,完全达到自媒体成片质量。

python 复制代码
import cv2
import os
import numpy as np

def images_to_video(
    image_folder, 
    output_video, 
    fps=5, 
    target_size=(1920, 1080), 
    fade_duration=0.5
):
    """
    多张图片批量转MP4视频【增强版】
    新增:统一分辨率、自动补黑边防变形、淡入淡出转场
    :param image_folder: 图片文件夹路径
    :param output_video: 输出视频路径
    :param fps: 帧率
    :param target_size: 目标分辨率 默认1080P
    :param fade_duration: 单张图片淡入淡出总时长(秒)
    """
    img_suffix = ('.jpg', '.jpeg', '.png', '.bmp')
    img_list = [f for f in os.listdir(image_folder) if f.lower().endswith(img_suffix)]
    img_list.sort()

    if not img_list:
        print("❌ 文件夹内未找到任何图片!")
        return

    target_w, target_h = target_size
    fade_frame_num = int(fade_duration * fps / 2)
    fourcc = cv2.VideoWriter_fourcc(*'mp4v')
    video_writer = cv2.VideoWriter(output_video, fourcc, fps, (target_w, target_h))

    def resize_and_pad(img):
        """统一尺寸,等比例缩放+补黑边,杜绝拉伸变形"""
        h, w = img.shape[:2]
        scale = min(target_w / w, target_h / h)
        new_w, new_h = int(w * scale), int(h * scale)
        img_resized = cv2.resize(img, (new_w, new_h))

        # 计算居中填充黑边
        top = (target_h - new_h) // 2
        bottom = target_h - new_h - top
        left = (target_w - new_w) // 2
        right = target_w - new_w - left

        return cv2.copyMakeBorder(
            img_resized, top, bottom, left, right,
            cv2.BORDER_CONSTANT, value=[0, 0, 0]
        )

    def fade_transition(frame1, frame2, fade_frames):
        """生成两张图片之间的淡入淡出过渡帧"""
        frames = []
        for i in range(fade_frames):
            alpha = i / fade_frames
            blend = cv2.addWeighted(frame1, 1 - alpha, frame2, alpha, 0)
            frames.append(blend)
        return frames

    frame_buffer = []
    for idx, img_name in enumerate(img_list):
        img_path = os.path.join(image_folder, img_name)
        frame = cv2.imread(img_path)
        if frame is None:
            print(f"⚠️ 读取失败:{img_name}")
            continue
        # 统一尺寸
        frame_pad = resize_and_pad(frame)
        frame_buffer.append(frame_pad)
        print(f"✅ 预处理完成:{img_name}")

    # 逐帧写入 + 首尾淡入淡出 + 图片间转场
    total_img = len(frame_buffer)
    stay_frames = int(1.0 * fps)

    for i in range(total_img):
        current_frame = frame_buffer[i]
        # 开头淡入
        if i == 0:
            for n in range(fade_frame_num):
                alpha = n / fade_frame_num
                blank = np.zeros_like(current_frame)
                fade_in = cv2.addWeighted(blank, 1 - alpha, current_frame, alpha, 0)
                video_writer.write(fade_in)

        # 主体停留帧
        for _ in range(stay_frames):
            video_writer.write(current_frame)

        # 图片之间淡出转场(最后一张不淡出)
        if i != total_img - 1:
            next_frame = frame_buffer[i+1]
            trans_frames = fade_transition(current_frame, next_frame, fade_frame_num)
            for f in trans_frames:
                video_writer.write(f)
        # 结尾淡出
        elif i == total_img - 1:
            for n in range(fade_frame_num, 0, -1):
                alpha = n / fade_frame_num
                blank = np.zeros_like(current_frame)
                fade_out = cv2.addWeighted(blank, 1 - alpha, current_frame, alpha, 0)
                video_writer.write(fade_out)

    video_writer.release()
    print(f"\n🎉 高清视频合成完成!保存路径:{output_video}")

# ==================== 自定义配置区 ====================
if __name__ == "__main__":
    IMAGE_FOLDER = "./images"
    OUTPUT_VIDEO = "./output.mp4"
    FPS = 8
    RESOLUTION = (1920, 1080)   # 可改为 (1280,720) 720P
    FADE_TIME = 0.6             # 转场时长

    images_to_video(
        image_folder=IMAGE_FOLDER,
        output_video=OUTPUT_VIDEO,
        fps=FPS,
        target_size=RESOLUTION,
        fade_duration=FADE_TIME
    )

📝 超详细使用教程(新手零门槛)

第一步:新建文件夹

  1. 在桌面新建一个文件夹,比如命名为 图片转视频

  2. 在文件夹内新建子文件夹,命名为 images

  3. 把需要合成的所有图片,全部放入 images文件夹

💡 小技巧:图片按 1.jpg、2.jpg、3.jpg 命名,排序更精准,避免画面错乱

第二步:修改配置参数

代码底部「自定义配置区」可自由修改:

  • FPS帧率:数值越小,单张图片停留越久
  • 相册慢播放:3-6帧

  • 正常短视频:24-30帧

  • OUTPUT_VIDEO:自定义视频保存名称和路径

第三步:运行代码

直接运行py文件,等待几秒,即可在根目录生成无水印高清 output.mp4


✨ 高阶优化 & 自媒体实用搭配

1. 适配AI数字人场景(搭配HeyGen)

很多人用HeyGen做数字人视频,需要静态背景图轮播视频,用这个工具批量合成背景视频,再导入HeyGen叠加数字人,画面质感远超单图静态背景。

2. 搭配开源AI配音

用之前推荐的 ChatTTS、CosyVoice 生成配音音频,再用剪映合并视频和音频,全程免费无版权,完美制作自媒体口播、科普视频。

3. 进阶功能拓展(可自行升级)

  • 已更新:全局淡入淡出转场 + 首尾渐变特效

  • 已更新:智能统一分辨率、自动补黑边,彻底解决画面拉伸变形

  • 批量遍历多级文件夹、自动批量生成多个视频

  • 添加进度条、异常报错提示


💡 写在最后

一个简单的Python脚本,就能替代各类付费剪辑工具、在线转换网站。

最大的优势就是 安全、免费、可控,自媒体素材、私密照片不用上传第三方平台,本地一键合成高清视频。

不用懂复杂开发,复制代码、改个参数就能直接用,新手也能轻松拿捏!


相关推荐
l1t1 小时前
测试DuckDB luajit插件读取本地通达信文件
开发语言·数据库·duckdb
捧 花1 小时前
FastAPI 基础语法:从一个完整接口理解 Web API 的设计
前端·python·fastapi·middleware
老一岁1 小时前
c问题总结(2)
c语言·开发语言
Ming_studying1 小时前
Python批量压缩图片:支持JPG_PNG_WebP、尺寸限制与CSV报告
开发语言·图像处理·python·pillow·图片压缩
大熊背1 小时前
ISP图像处理中大数乘法溢出处理(一)
人工智能·python·算法·溢出处理
风月说与山鬼2 小时前
JS闭包详解
开发语言·javascript
何以解忧,唯有..2 小时前
Python协程详解:从生成器到async/await的完整指南
开发语言·python
奶茶树2 小时前
【C++】13. C++11新特性【上】
c语言·开发语言·c++·git·github
hhzz2 小时前
智慧校园13类视频异常检测:数据集与预训练模型全攻略
人工智能·pytorch·python·深度学习·目标检测·机器学习