東閣 發表於 2026-2-15 17:20:00

手把手教你用 Python 批量拼接图片(无需ps,适用快速修改拼接)附已打包好软件链接

<p>**背景介绍**<br>
日常工作或学习中,我们经常会遇到这样的问题:</p>
<ul>
<li>有一堆图片(比如实验截图、作品图、论文附图)</li>
<li>想按固定排版拼接成一张大图</li>
<li>要求清晰度不能降低</li>
<li>还要自动分组,批量生成多张拼图</li>
</ul>
<p>如果手动用 PS 一张张拖拽,不仅累,还容易出错。</p>
<p>今天这段 Python 代码可以帮你:</p>
<p>✅ 自动读取文件夹内所有图片<br>
✅ 按 2×5 排列(可自定义)<br>
✅ 自动按数字顺序排序(1.jpg → 2.jpg → 10.jpg 不会乱序)<br>
✅ 自动保持原始分辨率<br>
✅ 批量生成拼图</p>
<p>运行后,你会在原文件夹里看到:<br>
<code>collage_final.jpg</code><br>
如果图片超过 9 张,会自动生成:<br>
<code>collage_final_1.jpg collage_final_2.jpg </code><br>
<strong>代码功能说明</strong><br>
这段代码的核心作用只有一句话:<br>
<strong>把一个文件夹里的图片,按 3 行 × 3 列排好,拼成一张高清大图。</strong><br>
它的工作流程可以理解为:</p>
<ol>
<li>找到所有图片</li>
<li>排序</li>
<li>创建一张大白画布</li>
<li>把图片一张张“贴”上去</li>
<li>保存为高清文件</li>
</ol>
<p>适合:</p>
<ul>
<li>论文图片拼接</li>
<li>实验截图汇总</li>
<li>产品展示图制作</li>
<li>批量图片整理</li>
</ul>
<p><strong>运行环境准备</strong></p>
<ul>
<li>
<p> 安装 Python<br>
要求:<br>
<strong>Python 3.8 及以上版本</strong><br>
如果没有安装,去官网下载并安装:<br>
https://www.python.org/downloads/<br>
安装时务必勾选:<br>
<code>Add Python to PATH</code></p>
</li>
<li>
<p> 安装依赖库<br>
-这段代码只用到一个库:Pillow<br>
<code>pip install pillow </code></p>
</li>
</ul>
<p><strong>详细运行步骤</strong></p>
<ul>
<li> 准备图片文件夹<br>
比如你有一个文件夹:<code>D:\image_test </code><br>
里面放:</li>
</ul>
<pre><code>1.jpg
2.jpg
3.jpg
...
9.jpg
</code></pre>
<ul>
<li> 新建 Python 文件<br>
在任意位置新建:<code>collage.py </code><br>
把下面的完整代码复制进去:</li>
</ul>
<details open="">
<summary>点击查看代码</summary>
<pre><code>import re
from PIL import Image
import os

# ==================== 手动配置区 ====================
TARGET_PATH = r'D:\【your_folder】'
IMAGES_PER_GROUP = 9         
ROWS = 3                     
COLS = 3      
BOTTOM_PADDING = 20
# ===================================================

def natural_sort_key(s):
    """自然排序:确保 1.jpg, 2.jpg, 10.jpg 按数字顺序排列"""
    return [int(text) if text.isdigit() else text.lower()
            for text in re.split('(+)', s)]

def create_collage(folder_path):

    if not os.path.exists(folder_path):
      print("路径不存在,请检查 TARGET_PATH。")
      return

    valid_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.webp', '.tiff')
    raw_files = [
      f for f in os.listdir(folder_path)
      if f.lower().endswith(valid_extensions)
    ]
   
    raw_files =

    image_files = sorted(
      ,
      key=lambda x: natural_sort_key(os.path.basename(x))
    )
   
    if not image_files:
      print("未找到图片,请检查路径。")
      return

    with Image.open(image_files) as first_img:
      img_width, img_height = first_img.size
      input_extension = os.path.splitext(image_files)
      img_mode = first_img.mode
      img_dpi = first_img.info.get('dpi')

      print(f"单图尺寸: {img_width} x {img_height}")

    canvas_width = COLS * img_width
    canvas_height = (ROWS * img_height) + BOTTOM_PADDING
   
    groups = [
      image_files
      for i in range(0, len(image_files), IMAGES_PER_GROUP)
    ]
   
    for group_num, group_images in enumerate(groups):

      canvas = Image.new(img_mode, (canvas_width, canvas_height), color='white')
      
      for idx, img_path in enumerate(group_images):
            try:
                with Image.open(img_path) as img:

                  if img.size != (img_width, img_height):
                        img = img.resize((img_width, img_height), Image.Resampling.LANCZOS)
                  
                  if img.mode != img_mode:
                        img = img.convert(img_mode)
                        
                  row_idx = idx // COLS
                  col_idx = idx % COLS
                  x = col_idx * img_width
                  y = row_idx * img_height
                  
                  canvas.paste(img, (x, y))
               
            except Exception as e:
                print(f"处理出错: {img_path}, 原因: {e}")
      
      suffix = f"_{group_num + 1}" if len(groups) &gt; 1 else ""
      save_filename = f"collage_final{suffix}{input_extension}"
      save_path = os.path.join(folder_path, save_filename)
      
      save_params = {}

      if input_extension.lower() in ['.jpg', '.jpeg']:
            save_params['quality'] = 100
            save_params['subsampling'] = 0
      
      if img_dpi:
            save_params['dpi'] = img_dpi
            
      canvas.save(save_path, **save_params)
      print(f"成功生成: {save_filename}")

if __name__ == "__main__":
    create_collage(TARGET_PATH)

</code></pre>
</details>
<ul>
<li> 修改路径<br>
找到:<code>TARGET_PATH = r'D:\【your_folder】' </code></li>
<li> 其他参数:<br>
<code>IMAGES_PER_GROUP</code>为照片总数<br>
<code>ROWS</code>为行数<br>
<code>COLS</code>为列数<br>
<code>BOTTOM_PADDING </code>为底部留白的像素</li>
<li> 运行代码查看结果<br>
打开图片文件夹,你会看到拼好的大图。<br>
特点:</li>
</ul>
<ul>
<li>预设可以X行Y列排列</li>
<li>顺序正确</li>
<li>底部多 Zpx 留白</li>
</ul>
<p>现成软件下载链接:https://feishu.doubao.com/drive/file/GqctbI6aAo7PKVxosmCcgz4wn4e<br>
<strong>总结</strong></p>
<p>这段脚本做的事情非常简单:</p>
<ol>
<li>读取图片</li>
<li>排序</li>
<li>建立大画布</li>
<li>按 X×Y 粘贴</li>
<li>高清保存</li>
</ol><br><br>
来源:https://www.cnblogs.com/Laurentianelle/p/19618359
頁: [1]
查看完整版本: 手把手教你用 Python 批量拼接图片(无需ps,适用快速修改拼接)附已打包好软件链接