** 背景介紹**
日常工作或學習中,我們經常會遇到這樣的問題:
- 有一堆圖片(比如實驗截圖、作品圖、論文附圖)
- 想按固定排版拼接成一張大圖
- 要求清晰度不能降低
- 還要自動分組,批量生成多張拼圖
如果手動用 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.jpg
2.jpg
3.jpg
...
9.jpg
- [2] 新建 Python 文件
在任意位置新建:collage.py
把下面的完整代碼複製進去:
點擊查看代碼
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('([0-9]+)', 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 = [f for f in raw_files if "collage_final" not in f]
image_files = sorted(
[os.path.join(folder_path, f) for f in raw_files],
key=lambda x: natural_sort_key(os.path.basename(x))
)
if not image_files:
print("未找到圖片,請檢查路徑。")
return
with Image.open(image_files[0]) as first_img:
img_width, img_height = first_img.size
input_extension = os.path.splitext(image_files[0])[1]
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[i:i + IMAGES_PER_GROUP]
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) > 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)
- [3] 修改路徑
找到:TARGET_PATH = r'D:\【your_folder】' - [4] 其他參數:
IMAGES_PER_GROUP為照片總數
ROWS為行數
COLS為列數
BOTTOM_PADDING為底部留白的像素 - [5] 運行代碼查看結果
打開圖片文件夾,你會看到拼好的大圖。
特點:
- 預設可以X行Y列排列
- 順序正確
- 底部多 Zpx 留白
總結
這段腳本做的事情非常簡單:
- 讀取圖片
- 排序
- 建立大畫布
- 按 X×Y 粘貼
- 高清保存