如何写一个脚本定时拼接图片

wen 实用脚本 2

从零开始的自动化图像处理指南

目录导读

  • 什么是定时拼接图片?应用场景与核心需求
  • 技术选型:Python + Pillow + 计划任务的黄金组合
  • 手把手编写图片拼接脚本(含完整代码)
  • 实现定时执行:Windows任务计划与Linux Crontab
  • 常见问题解答(FAQ)
  • 进阶优化:动态参数、错误处理与日志记录

是否经常需要将多张截图、图表或监控图像合并成一张长图?手动操作不仅耗时,还容易出错,本文将带你从零掌握“定时拼接图片”的脚本编写方法,实现全自动处理。

如何写一个脚本定时拼接图片

什么是定时拼接图片?应用场景与核心需求

定时拼接图片是指通过脚本在预设时间点自动读取指定文件夹内的图片,按照顺序或规则合并为一张完整图像,并保存/上传结果,典型场景包括:

  • 监控系统:每小时将多路摄像头截图拼接为全景监控图生产**:每天自动合成行业数据图表长图
  • 报表生成:将多个统计报表截图合并后邮件发送
  • 社交自动化:定时生成产品宣传条幅并发布

核心需求可概括为:稳定执行、错误容错、跨平台兼容

技术选型:Python + Pillow + 计划任务的黄金组合

技术组件 作用 推荐理由
Python 3.x 脚本核心语言 跨平台、库丰富、学习成本低
Pillow 库 图像处理(打开/拼接/保存) 轻量且功能完善
计划任务系统 定时触发脚本 Windows任务计划/Linux Crontab

安装Pillow代码:

pip install Pillow

手把手编写图片拼接脚本(含完整代码)

1 核心思路

  1. 按文件名或创建时间排序图片
  2. 确定拼接方向(垂直/水平)
  3. 计算目标画布尺寸并粘贴每张图片
  4. 保存结果文件

2 完整脚本示例

import os
from PIL import Image
from datetime import datetime
def merge_images_vertical(input_folder, output_folder, output_name="merged.jpg"):
    """
    垂直拼接文件夹内所有jpg/png图片
    """
    # 获取所有图片文件并按名称排序
    image_files = [f for f in os.listdir(input_folder) 
                   if f.lower().endswith(('.jpg', '.jpeg', '.png'))]
    image_files.sort()  # 按文件名排序,可改为按修改时间
    if not image_files:
        print("⚠️ 未找到图片文件")
        return
    images = []
    total_height = 0
    max_width = 0
    # 读取所有图片并计算画布尺寸
    for filename in image_files:
        img_path = os.path.join(input_folder, filename)
        img = Image.open(img_path).convert("RGB")  # 确保统一模式
        images.append(img)
        if img.width > max_width:
            max_width = img.width
        total_height += img.height
    # 创建新画布
    new_img = Image.new("RGB", (max_width, total_height), color="white")
    # 粘贴图片(垂直拼接)
    current_y = 0
    for img in images:
        # 居中处理(如果图片宽度不一)
        x_offset = (max_width - img.width) // 2
        new_img.paste(img, (x_offset, current_y))
        current_y += img.height
    # 保存结果
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    output_path = os.path.join(output_folder, f"{output_name}_{timestamp}.jpg")
    new_img.save(output_path, quality=95)
    print(f"✅ 拼接完成:{output_path}")
    return output_path
# 调用示例
if __name__ == "__main__":
    merge_images_vertical(
        input_folder="./screenshots",  # 输入文件夹
        output_folder="./output"      # 输出文件夹
    )

实现定时执行:Windows任务计划与Linux Crontab

Windows 任务计划程序

  1. 打开“任务计划程序” → 创建基本任务
  2. 触发器:选择“每天”并设置时间(如每天15:00)
  3. 操作:启动程序 → 程序或脚本填写 python.exe 路径
  4. 参数:填写你的脚本完整路径,如 D:\scripts\merge.py

注意事项

  • 确保Python路径没有空格,否则用引号包裹
  • 勾选“不管用户是否登录都要运行”

Linux Crontab 配置

# 编辑定时任务
crontab -e
# 每天15:00执行脚本(需指定Python和脚本完整路径)
0 15 * * * /usr/bin/python3 /home/user/scripts/merge.py >> /home/user/scripts/log.txt 2>&1

重要提示

  • 脚本内所有路径必须使用绝对路径
  • 目录权限需允许脚本读写

常见问题解答(FAQ)

Q1:拼接后图片颜色失真怎么办?
A:检查原始图片是否均为RGB模式,可在代码中添加 .convert("RGB") 统一处理(已在上文脚本中实现)。

Q2:如何将图片横向拼接(并列左右排列)?
A:将以下变量替换即可:

# 将垂直拼接改为水平拼接
total_width = sum(img.width for img in images)
max_height = max(img.height for img in images)
new_img = Image.new("RGB", (total_width, max_height), "white")
current_x = 0
for img in images:
    y_offset = (max_height - img.height) // 2
    new_img.paste(img, (current_x, y_offset))
    current_x += img.width

Q3:如何只拼接指定数量(如最近10张)的图片?
A:在排序后添加切片:image_files = image_files[-10:] 取最后10个文件。

Q4:脚本执行时提示“权限错误”如何解决?
A:检查输入/输出文件夹的读写权限,或使用管理员身份运行脚本。

进阶优化:动态参数、错误处理与日志记录

1 动态参数配置(使用命令行参数)

import argparse
parser = argparse.ArgumentParser(description="定时图片拼接工具")
parser.add_argument("--input", required=True, help="输入文件夹路径")
parser.add_argument("--output", required=True, help="输出文件夹路径")
parser.add_argument("--max_images", type=int, default=0, help="最多处理图片数")
args = parser.parse_args()

2 增强错误处理

try:
    # 核心拼接逻辑
except FileNotFoundError as e:
    print(f"❌ 文件未找到:{e}")
except Exception as e:
    print(f"❌ 未知错误:{e}")
finally:
    # 清理临时资源
    pass

3 集成日志系统

import logging
logging.basicConfig(filename='merge.log', level=logging.INFO, 
                    format='%(asctime)s - %(levelname)s - %(message)s')
logging.info("脚本开始执行")

通过本教程,你已掌握定时拼接图片的核心技术,从代码编写到系统定时任务配置,每一步均经过多次验证,建议先从手动执行脚本开始调试,确认无误后再配置自动计划任务。

如果你想进一步实现智能去重(避免拼接重复图片)或云存储上传(自动上传到如阿里云OSS等服务),欢迎在评论区留言讨论。

抱歉,评论功能暂时关闭!