Python Image Library:如何将4个图像组合成2 x 2网格?

Nop*_*ope 27 python python-imaging-library

我有4个目录,包含动画图像.我想拍摄一组图像并生成一个图像,其中4个图像排列成动画的每个帧的2x2网格.

到目前为止我的代码是:

import Image

fluid64 = "Fluid64_half_size/00"
fluid128 = "Fluid128_half_size/00"
fluid512 = "Fluid512_half_size/00" 
fluid1024 = "Fluid1024_half_size/00" 

out_image = "Fluid_all/00"

for pic in range(1, 26):
    blank_image = Image.open("blank.jpg")

    if pic < 10:
        image_num = "0"+str(pic)
    else:
        image_num = str(pic)

    image64 = Image.open(fluid64+image_num+".jpg")
    image128 = Image.open(fluid128+image_num+".jpg")
    image512 = Image.open(fluid512+image_num+".jpg")
    image1024 = Image.open(fluid1024+image_num+".jpg")
    out = out_image + image_num + ".jpg"

    blank_image.paste(image64, (0,0)).paste(fluid128, (400,0)).paste(fluid512, (0,300)).paste(fluid1024, (400,300)).save(out)
Run Code Online (Sandbox Code Playgroud)

不知道为什么它不起作用.我收到错误:

Traceback (most recent call last):
  File "C:\Users\Casey\Desktop\Image_composite.py", line 24, in <module>
    blank_image.paste(image64, (0,0)).paste(fluid128, (400,0)).paste(fluid512, (
ste(fluid1024, (400,300)).save(out)
AttributeError: 'NoneType' object has no attribute 'paste'
shell returned 1
Run Code Online (Sandbox Code Playgroud)

任何帮助都是极好的.谢谢!

jsb*_*eno 39

唯一的问题是"粘贴"不会返回图像对象 - 而是在原位修改"空白"图像.

因此,当调用第二个粘贴(使用fuild128图像的粘贴)时,它会尝试应用于"无" - 这是第一个图像的返回值.

如果这是您遇到的唯一问题,请每行进行一次粘贴调用,如下所示:

blank_image.paste(image64, (0,0))
blank_image.paste(fluid128, (400,0))
blank_image.paste(fluid512, (0,300))
blank_image.paste(fluid1024, (400,300))
blank_image.save(out)
Run Code Online (Sandbox Code Playgroud)

虽然您可能需要缩放每个图像,以便它们的格式也匹配.并且您的"image_num"变量的代码是不必要的.Python对字符串非常好 - 只需执行以下操作:

image64 = Image.open(fluid64 + "%02d.jpg" % pic)
Run Code Online (Sandbox Code Playgroud)


小智 10

您可能希望使用以下内容:

blank_image = Image.new("RGB", (800, 600))
Run Code Online (Sandbox Code Playgroud)

这将在内存中创建一个新区域,您可以在其中生成图像.然后,您应该能够将图像粘贴到其中.

然后你需要在以后再次保存它:

blank_image.save("blank.jpg")
Run Code Online (Sandbox Code Playgroud)