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

使用Python PIL/Image生成不同宽高的图片网格

自适应宽高的图片网格生成方案(PIL实现)

下面是针对不同宽高图片生成紧凑网格的实现,核心是计算每列的最大宽度和每行的最大高度,避免全局最大尺寸带来的空间浪费:

from PIL import Image

def image_grid(imgs, rows, cols):
    assert len(imgs) == rows * cols, "图片数量必须等于行数×列数"
    
    # 计算每列的最大宽度
    col_widths = [max(imgs[i + j*cols].width for j in range(rows)) for i in range(cols)]
    # 计算每行的最大高度
    row_heights = [max(imgs[i*cols + j].height for j in range(cols)) for i in range(rows)]
    
    # 计算网格总宽高
    total_width = sum(col_widths)
    total_height = sum(row_heights)
    
    grid = Image.new('RGB', size=(total_width, total_height))
    
    # 逐行逐列粘贴图片
    current_y = 0
    for row in range(rows):
        current_x = 0
        row_h = row_heights[row]
        for col in range(cols):
            img_idx = row * cols + col
            img = imgs[img_idx]
            # 左上角对齐粘贴
            grid.paste(img, box=(current_x, current_y))
            current_x += col_widths[col]
        current_y += row_h
    
    return grid

# 示例用法
# imgs = [Image.open(f"img_{i}.jpg") for i in range(9)]
# grid = image_grid(imgs, rows=3, cols=3)
# grid.save("compact_grid.jpg")

关键说明

  • 紧凑布局核心:通过遍历列和行,分别计算每列的最大宽度、每行的最大高度,确保每个单元格只占用该列/行所需的最小空间。
  • 位置计算:维护current_x和current_y变量,逐列累加列宽、逐行累加行高,确保每张图片放在正确的单元格位置。
  • 可选优化:居中对齐
    如果希望图片在单元格内居中显示,可修改粘贴坐标的计算逻辑:
# 替换原grid.paste行
x_offset = (col_widths[col] - img.width) // 2
y_offset = (row_h - img.height) // 2
grid.paste(img, box=(current_x + x_offset, current_y + y_offset))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 19:11:31