如何将目录下所有图片垂直拼接为长图(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
相关产品推荐
相关产品推荐

