Python PIL/Image从序列图像制作3x3网格

Hoy*_*oyo 2 python image python-imaging-library pillow

我正在尝试通过序列图像制作一个3x3网格,但似乎无法做到正确.图像在文件夹中,命名为0 - 8(共9个图像),最终一个图像网格3x3的输出应如下

image0 image1 image2
image3 image4 image5
image6 image7 image8 
Run Code Online (Sandbox Code Playgroud)

我试图关注如何使用PIL/Pillow将图像合并到画布中?但无法使其正常工作.

无需更改图像中的任何内容,只需将它们合并并制作3x3网格即可

Iva*_*van 8

(cols*img_height, rows*img_width)rows*cols图像制作任意形状的网格:

def image_grid(imgs, rows, cols):
    assert len(imgs) == rows*cols

    w, h = imgs[0].size
    grid = Image.new('RGB', size=(cols*w, rows*h))
    grid_w, grid_h = grid.size
    
    for i, img in enumerate(imgs):
        grid.paste(img, box=(i%cols*w, i//cols*h))
    return grid
Run Code Online (Sandbox Code Playgroud)

在你的情况下,假设imgs是一个列表PIL图片:

grid = image_grid(imgs, rows=3, cols=3)
Run Code Online (Sandbox Code Playgroud)

  • `image, *images = my_list` 会将 *list* 解压为两个变量: `image` 将保存第一个元素 (*ie* `my_list[0]`) 和 `images` 其余元素 (*ie* `my_list[ 1:]`),单个星号用于[可迭代解包](https://docs.python.org/3/reference/expressions.html#expression-lists)。请记住,“images”将是一个*列表*(如果“my_list”只有一个元素,则可以为空)。此外,您可以将*列表*解压到...另一个*列表*:`[*images]`,它基本上只是`图像`。最酷的是,您可以使用其他元素定义您的*列表*(就像您... (2认同)
  • ...用文字而不是变量)。这里我添加了 `image`: `[image, *images]`。因此,生成的 *list* 包含“image”作为第一个元素,图像内容(**解压**)作为 *list* 的以下元素。了解这种行为的最好方法就是自己尝试一下:定义 `x = [1,2,3]`,解压为 `a, *rest = x`,`rest` 会是什么?你能猜出 `[*rest, a]` 会是什么吗?现在,对于更具挑战性的事情:“a, *(what, _) = x”,“what”会是什么?那么 `a, *(b,*c) = [1,2,3,4]` 中的 `c` 呢?祝你好运 ;) (2认同)

dmi*_*yro 6

这是一个如何做到这一点的例子(考虑图像是你的一个图像):

    img_w, img_h = image.size
    background = Image.new('RGBA',(1300, 1300), (255, 255, 255, 255))
    bg_w, bg_h = background.size
    offset = (10,(((bg_h - img_h)) / 2)-370)
    background.paste(image1,offset)
Run Code Online (Sandbox Code Playgroud)

调整偏移,宽度和高度以满足您的要求.