找回密码
 立即注册
首页 业界区 业界 手把手教你用 Python 批量拼接图片(无需ps,适用快速修 ...

手把手教你用 Python 批量拼接图片(无需ps,适用快速修改拼接)

尸酒岐 5 小时前
**  背景介绍**
日常工作或学习中,我们经常会遇到这样的问题:

  • 有一堆图片(比如实验截图、作品图、论文附图)
  • 想按固定排版拼接成一张大图
  • 要求清晰度不能降低
  • 还要自动分组,批量生成多张拼图
如果手动用 PS 一张张拖拽,不仅累,还容易出错。
今天这段 Python 代码可以帮你:
✅ 自动读取文件夹内所有图片
✅ 按 2×5 排列(可自定义)
✅ 自动按数字顺序排序(1.jpg → 2.jpg → 10.jpg 不会乱序)
✅ 自动保持原始分辨率
✅ 批量生成拼图
运行后,你会在原文件夹里看到:
collage_final.jpg
如果图片超过 9 张,会自动生成:
collage_final_1.jpg collage_final_2.jpg
代码功能说明
这段代码的核心作用只有一句话:
把一个文件夹里的图片,按 3 行 × 3 列排好,拼成一张高清大图。
它的工作流程可以理解为:

  • 找到所有图片
  • 排序
  • 创建一张大白画布
  • 把图片一张张“贴”上去
  • 保存为高清文件
适合:

  • 论文图片拼接
  • 实验截图汇总
  • 产品展示图制作
  • 批量图片整理
运行环境准备

  • [1] 安装 Python
    要求:
    Python 3.8 及以上版本
    如果没有安装,去官网下载并安装:
    https://www.python.org/downloads/
    安装时务必勾选:
    Add Python to PATH
  • [2] 安装依赖库
    -这段代码只用到一个库:Pillow
    pip install pillow
详细运行步骤

  • [1] 准备图片文件夹
    比如你有一个文件夹:D:\image_test
    里面放:
  1. 1.jpg
  2. 2.jpg
  3. 3.jpg
  4. ...
  5. 9.jpg
复制代码

  • [2] 新建 Python 文件
    在任意位置新建:collage.py
    把下面的完整代码复制进去:
点击查看代码
  1. import re
  2. from PIL import Image
  3. import os
  4. # ==================== 手动配置区 ====================
  5. TARGET_PATH = r'D:\【your_folder】'
  6. IMAGES_PER_GROUP = 9           
  7. ROWS = 3                       
  8. COLS = 3      
  9. BOTTOM_PADDING = 20  
  10. # ===================================================
  11. def natural_sort_key(s):
  12.     """自然排序:确保 1.jpg, 2.jpg, 10.jpg 按数字顺序排列"""
  13.     return [int(text) if text.isdigit() else text.lower()
  14.             for text in re.split('([0-9]+)', s)]
  15. def create_collage(folder_path):
  16.     if not os.path.exists(folder_path):
  17.         print("路径不存在,请检查 TARGET_PATH。")
  18.         return
  19.     valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.webp', '.tiff')
  20.     raw_files = [
  21.         f for f in os.listdir(folder_path)
  22.         if f.lower().endswith(valid_extensions)
  23.     ]
  24.    
  25.     raw_files = [f for f in raw_files if "collage_final" not in f]
  26.     image_files = sorted(
  27.         [os.path.join(folder_path, f) for f in raw_files],
  28.         key=lambda x: natural_sort_key(os.path.basename(x))
  29.     )
  30.    
  31.     if not image_files:
  32.         print("未找到图片,请检查路径。")
  33.         return
  34.     with Image.open(image_files[0]) as first_img:
  35.         img_width, img_height = first_img.size
  36.         input_extension = os.path.splitext(image_files[0])[1]
  37.         img_mode = first_img.mode
  38.         img_dpi = first_img.info.get('dpi')
  39.         print(f"单图尺寸: {img_width} x {img_height}")
  40.     canvas_width = COLS * img_width
  41.     canvas_height = (ROWS * img_height) + BOTTOM_PADDING
  42.    
  43.     groups = [
  44.         image_files[i:i + IMAGES_PER_GROUP]
  45.         for i in range(0, len(image_files), IMAGES_PER_GROUP)
  46.     ]
  47.    
  48.     for group_num, group_images in enumerate(groups):
  49.         canvas = Image.new(img_mode, (canvas_width, canvas_height), color='white')
  50.         
  51.         for idx, img_path in enumerate(group_images):
  52.             try:
  53.                 with Image.open(img_path) as img:
  54.                     if img.size != (img_width, img_height):
  55.                         img = img.resize((img_width, img_height), Image.Resampling.LANCZOS)
  56.                     
  57.                     if img.mode != img_mode:
  58.                         img = img.convert(img_mode)
  59.                         
  60.                     row_idx = idx // COLS
  61.                     col_idx = idx % COLS
  62.                     x = col_idx * img_width
  63.                     y = row_idx * img_height
  64.                     
  65.                     canvas.paste(img, (x, y))
  66.                
  67.             except Exception as e:
  68.                 print(f"处理出错: {img_path}, 原因: {e}")
  69.         
  70.         suffix = f"_{group_num + 1}" if len(groups) > 1 else ""
  71.         save_filename = f"collage_final{suffix}{input_extension}"
  72.         save_path = os.path.join(folder_path, save_filename)
  73.         
  74.         save_params = {}
  75.         if input_extension.lower() in ['.jpg', '.jpeg']:
  76.             save_params['quality'] = 100
  77.             save_params['subsampling'] = 0
  78.         
  79.         if img_dpi:
  80.             save_params['dpi'] = img_dpi
  81.             
  82.         canvas.save(save_path, **save_params)
  83.         print(f"成功生成: {save_filename}")
  84. if __name__ == "__main__":
  85.     create_collage(TARGET_PATH)
复制代码

  • [3] 修改路径
    找到:TARGET_PATH = r'D:\【your_folder】'
  • [4] 其他参数:
    IMAGES_PER_GROUP为照片总数
    ROWS为行数
    COLS为列数
    BOTTOM_PADDING 为底部留白的像素
  • [5] 运行代码查看结果
    打开图片文件夹,你会看到拼好的大图。
    特点:


  • 预设可以X行Y列排列
  • 顺序正确
  • 底部多 Zpx 留白
现成软件下载链接:https://feishu.doubao.com/drive/file/GqctbI6aAo7PKVxosmCcgz4wn4e
总结
这段脚本做的事情非常简单:

  • 读取图片
  • 排序
  • 建立大画布
  • 按 X×Y 粘贴
  • 高清保存

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册