You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将目录下所有图片垂直拼接为长图(Python PIL报错排查)

报错原因

报错核心是传入paste方法的参数类型错误,同时原代码存在多处逻辑问题:

  • 你执行tmpImg = img.load()后,tmpImg是PixelAccess类型的像素读写对象,不是Image图像实例,本身没有mode、size这类图像属性。你用类调用实例方法Image.Image.paste()时,把tmpImg作为self参数传入,方法内部访问self.mode时就会触发属性不存在的报错。
  • 其余逻辑错误:
    • 提前把单张图片的高度乘以总张数赋值给h,后续计算粘贴位置时又用这个放大后的h乘以序号,会导致粘贴位置完全偏移出画布
    • 循环范围写为range(fileCount - 1),会漏掉最后一张图片
    • 初始打开的第一张图没有粘贴到新画布上
    • 混用变量名(directory/dir、filePrefix/prefix、fileExtension/extension),还使用了JavaScript语法的console.log,Python中对应的打印方法是print
    • 循环内手动写number += 1是多余操作,for循环会自动更新迭代变量
修正后可运行代码

以下代码兼容同宽度不同高度的图片垂直拼接,自动按编号读取文件,拼接位置不会错位:

from PIL import Image
from tqdm import tqdm
import os

def stitch(directory, filePrefix, fileExtension, output_file):
    img_list = []
    total_height = 0
    target_width = None
    idx = 0

    # 按序号读取所有符合命名规则的图片
    while True:
        cur_path = os.path.join(directory, f"{filePrefix}{idx}{fileExtension}")
        if not os.path.exists(cur_path):
            break
        cur_img = Image.open(cur_path)
        img_list.append(cur_img)
        total_height += cur_img.height
        if target_width is None:
            target_width = cur_img.width
        idx += 1

    if len(img_list) == 0:
        raise RuntimeError("未找到符合命名规则的图片")

    # 创建空白长图
    merged_img = Image.new("RGB", (target_width, total_height))
    current_y = 0
    print("Setup Complete")

    # 逐张粘贴图片
    for img in tqdm(img_list):
        merged_img.paste(img, (0, current_y))
        current_y += img.height

    # 保存结果
    merged_img.save(output_file)
    print(f"拼接完成,文件已保存至 {output_file}")

# 调用示例
if __name__ == "__main__":
    stitch(
        directory=r"c:\Users\marcus\Desktop\Stuff\Files\code\你的图片文件夹路径",
        filePrefix="group1.",
        fileExtension=".jpg",
        output_file="merged_vertical.jpg"
    )
关键修正说明
  • 移除了错误的img.load()调用,直接对新建的Image实例调用paste实例方法,不需要手动传入self参数
  • 改为逐张累加图片高度计算总画布高度和粘贴位置,既支持等高清图,也支持高度不一致的条漫类图片拼接
  • 自动按序号读取文件,不需要手动传入文件总数,也不会漏图
  • 统一变量命名,替换了JS语法的打印方法
  • 使用os.path.join拼接文件路径,避免Windows/Linux路径分隔符不兼容问题

内容的提问来源于stack exchange,提问作者Camuise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:57:23