如何基于文件夹图片数量,用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
相关产品推荐
相关产品推荐

