最近发现有一个需求,就是将大量图片转化为视频MP4,然后动手写一个脚本完成这个需求,记录下。
我们需要创建一个可视化界面,允许用户选择文件夹,选择文件夹后获取其中的图片,并将这些图片转换为MP4格式的视频。最终生成的视频将保存到根目录下。
下面是一个完整的解决方案,使用PyQt5
实现可视化界面,OpenCV
库用于处理图像和视频转换。
import os
import cv2
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QLineEdit, QFileDialog, QLabel
from PyQt5.QtCore import Qt
class ImageToVideoApp(QWidget):
def __init__(self):
super().__init__()
# 初始化界面元素
self.setWindowTitle('图片转视频工具')
self.setGeometry(100, 100, 400, 200)
self.layout = QVBoxLayout()
# 创建选择文件夹按钮
self.folder_button = QPushButton('选择文件夹', self)
self.folder_button.clicked.connect(self.select_folder)
# 创建显示选择的文件夹路径的框
self.path_display = QLineEdit(self)
self.path_display.setPlaceholderText('选择文件夹后显示路径...')
self.path_display.setReadOnly(True)
# 创建合成按钮
self.combine_button = QPushButton('一键合成视频', self)
self.combine_button.clicked.connect(self.combine_images_to_video)
# 创建信息标签
self.info_label = QLabel('', self)
# 添加控件到布局
self.layout.addWidget(self.folder_button)
self.layout.addWidget(self.path_display)
self.layout.addWidget(self.combine_button)
self.layout.addWidget(self.info_label)
# 设置布局
self.setLayout(self.layout)
def select_folder(self):
folder = QFileDialog.getExistingDirectory(self, '选择文件夹')
if folder:
self.path_display.setText(folder)
def combine_images_to_video(self):
folder_path = self.path_display.text()
if not folder_path or not os.path.isdir(folder_path):
self.info_label.setText('请选择有效的文件夹!')
return
# 获取文件夹中的图片文件
images = [f for f in os.listdir(folder_path) if f.lower().endswith(('png', 'jpg', 'jpeg', 'bmp', 'gif'))]
images.sort() # 排序,确保图片按顺序合成视频
if not images:
self.info_label.setText('该文件夹中没有图片!')
return
# 获取第一张图片的尺寸来设置视频的分辨率
first_image = cv2.imread(os.path.join(folder_path, images[0]))
height, width, _ = first_image.shape
# 输出视频路径:将视频保存为同一文件夹中的 'output_video.mp4'
video_path = os.path.join(folder_path, "output_video.mp4")
# 使用OpenCV创建视频写入对象
fourcc = cv2.VideoWriter_fourcc(*'mp4v') # 编码方式
video_writer = cv2.VideoWriter(video_path, fourcc, 1, (width, height)) # 每秒1帧
# 将每张图片写入视频
for image_file in images:
image_path = os.path.join(folder_path, image_file)
image = cv2.imread(image_path)
video_writer.write(image)
video_writer.release() # 释放视频写入对象
self.info_label.setText(f'视频已成功生成!保存路径: {video_path}')
if __name__ == '__main__':
app = QApplication(sys.argv)
window = ImageToVideoApp()
window.show()
sys.exit(app.exec_())
代码解析:
窗口界面:我们使用
PyQt5
创建了一个窗口。选择文件夹:点击选择文件夹按钮时,打开文件夹选择对话框,选定文件夹后,路径显示框会显示选中的路径。
图片合成视频:点击一键合成按钮时,程序会:
- 获取文件夹中的所有图片。
- 使用
OpenCV
将这些图片按顺序合成一个视频,并将其保存在根目录下,命名为output_video.mp4
。 - 视频使用MP4编码格式。
视频生成:
cv2.VideoWriter
用于创建一个视频文件,设置视频的编码格式、帧率和分辨率(根据第一张图片的尺寸)。video_writer.write(image)
用于将每一张图片写入视频。
依赖库安装:
需要安装PyQt5
和OpenCV
,使用以下命令安装:
pip install pyqt5 opencv-python
运行效果:
- 运行程序后,点击“选择文件夹”按钮,选择包含图片的文件夹。
- 点击“一键合成视频”按钮,程序会将文件夹中的图片合成视频,保存为MP4格式到用户根目录下。
小结下:
介绍了如何使用 Python 中的 PyQt5 和 OpenCV 库,实现一个图形化界面工具,将文件夹中的图片转化为 MP4 格式的视频。