如何用Python Pillow开发适配多图数量的网格拼接函数
基于Pillow的多图自动网格拼接实现
环境准备
- 执行
pip install pillow完成基础依赖安装,无需深入掌握Pillow复杂操作逻辑,直接调用函数即可完成拼接
核心功能匹配
- 传入18张待拼接图片时,函数自动匹配生成3行6列的规整网格排布
- 无论图片总数为奇数还是偶数,均可正常运行,网格空缺位置自动生成同尺寸的空白占位块填充,不会出现画布错位、图片拉伸变形的问题
- 最终输出的拼接效果对齐堡垒之夜物品商店类机器人的卡片拼图样式:单图尺寸统一、卡片间距均匀、整体画布整齐无杂乱留白
可直接复用的完整函数代码
from PIL import Image import math def create_image_grid( image_paths: list, cell_size: tuple = (300, 380), gap: int = 15, outer_margin: int = 20, bg_color: tuple = (32, 30, 40), placeholder_color: tuple = (60, 58, 68) ): img_count = len(image_paths) # 18张图强制适配3x6网格,满足指定规格 if img_count == 18: cols, rows = 6, 3 # 其他数量自动计算适配横向舒展的网格比例 else: cols = math.ceil(math.sqrt(img_count * 2)) rows = math.ceil(img_count / cols) # 计算整体画布尺寸 canvas_width = outer_margin * 2 + cols * cell_size[0] + (cols - 1) * gap canvas_height = outer_margin * 2 + rows * cell_size[1] + (rows - 1) * gap canvas = Image.new("RGB", (canvas_width, canvas_height), bg_color) # 逐格填充内容 for idx in range(rows * cols): col_pos = idx % cols row_pos = idx // cols x = outer_margin + col_pos * (cell_size[0] + gap) y = outer_margin + row_pos * (cell_size[1] + gap) # 超出实际图片数量的位置填充占位块 if idx >= img_count: placeholder = Image.new("RGB", cell_size, placeholder_color) canvas.paste(placeholder, (x, y)) continue # 加载图片并等比例缩放匹配单元格尺寸 with Image.open(image_paths[idx]) as img: img.thumbnail(cell_size) # 居中放置图片,避免拉伸变形 paste_x = x + (cell_size[0] - img.width) // 2 paste_y = y + (cell_size[1] - img.height) // 2 canvas.paste(img, (paste_x, paste_y)) return canvas
调用方式
# 传入本地待拼接的图片路径列表,生成拼接完成的图像 result = create_image_grid(image_paths=["pic1.jpg", "pic2.jpg", "pic3.jpg"]) # 保存最终结果 result.save("grid_output.jpg")
参数说明
cell_size:单个图片卡片的宽高尺寸,可根据需求调整gap:相邻卡片之间的间距数值outer_margin:画布最外侧的留白宽度bg_color:整体画布的背景颜色,默认匹配深色卡片拼图的视觉风格placeholder_color:空缺位置填充的占位块颜色
内容的提问来源于stack exchange,提问作者Dead VFX
相关产品推荐
相关产品推荐

