You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于文件夹图片数量,用PIL和numpy修改函数生成网格拼图?

解决方案

原函数仅支持两张图片的垂直拼接,要实现3×3、4×4这类网格拼图,得从确定网格尺寸、统一图片大小、补全空缺、网格拼接这几个核心环节修改。以下是完整的实现代码:

from PIL import Image
import numpy as np
import glob

direct_loc = "/home/nikolas/Downloads/"

# 获取目标文件夹内所有JPG图片
images = glob.glob(direct_loc + '*.jpg')

def collage_maker(image_paths, output_name, start_n=3):
    # 1. 确定适配的网格尺寸:从指定起始规格开始,找到能容纳所有图片的最小n×n网格
    num_images = len(image_paths)
    n = start_n
    while n * n < num_images:
        n += 1
    grid_size = n

    # 2. 统一单元格尺寸:以第一张图片的尺寸为基准,也可自定义固定尺寸(比如(200,200))
    with Image.open(image_paths[0]) as base_img:
        cell_width, cell_height = base_img.size

    # 3. 准备拼接素材:缩放所有图片,补全空缺的黑色方块
    collage_cells = []
    # 处理现有图片
    for path in image_paths:
        img = Image.open(path).resize((cell_width, cell_height))
        collage_cells.append(np.array(img))
    # 生成黑色补全块(RGB值为0,0,0)
    num_empty = grid_size * grid_size - num_images
    for _ in range(num_empty):
        black_cell = np.zeros((cell_height, cell_width, 3), dtype=np.uint8)
        collage_cells.append(black_cell)
    
    # 4. 拼接网格:先横向拼接每行,再纵向拼接所有行
    rows = []
    for i in range(grid_size):
        start_idx = i * grid_size
        end_idx = start_idx + grid_size
        # 横向拼接当前行的所有单元格
        row = np.hstack(collage_cells[start_idx:end_idx])
        rows.append(row)
    # 纵向拼接所有行得到最终拼图
    final_collage = np.vstack(rows)
    Image.fromarray(final_collage).save(output_name)

# 调用函数生成网格拼图
collage_maker(images, 'grid_collage.jpg')

核心逻辑说明

  • 网格尺寸适配:从默认的3×3开始,自动计算能容纳所有图片的最小正方形网格(比如10张图会自动用4×4规格)。
  • 尺寸统一:所有图片会被缩放到相同尺寸,避免拼接时出现尺寸不匹配的问题。
  • 空缺补全:用纯黑色方块填充网格中未被图片占据的位置,保证拼图的规整性。
  • 网格拼接:通过np.hstack完成每行的横向拼接,再用np.vstack完成所有行的纵向拼接,最终生成标准网格。

你可以根据需求调整start_n参数(比如想从2×2开始就改成2),或者直接自定义单元格的固定尺寸(替换cell_width, cell_height的赋值即可)。

内容的提问来源于stack exchange,提问作者Sweetcheeks12354

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:01:30