Hoe voeg je afbeeldingen in een canvas samen met Pil / Pillow?

Ik ben niet bekend met Pil, maar ik weet dat het heel gemakkelijk is om een ​​bos van beelden in ImageMagick in een raster in te zetten.

Hoe plaats ik bijvoorbeeld 16 afbeeldingen in een 4 × 4-raster waar ik de kloof tussen rijen en kolommen kan opgeven?


Antwoord 1, Autoriteit 100%

Dit is eenvoudig te doen in PILook. Maak een lege afbeelding en plak gewoon in de afbeeldingen die je wilt op welke posities je nodig hebt met Plak . Hier is een snel voorbeeld:

import Image
#opens an image:
im = Image.open("1_tree.jpg")
#creates a new empty image, RGB mode, and size 400 by 400.
new_im = Image.new('RGB', (400,400))
#Here I resize my opened image, so it is no bigger than 100,100
im.thumbnail((100,100))
#Iterate through a 4 by 4 grid with 100 spacing, to place my image
for i in xrange(0,500,100):
    for j in xrange(0,500,100):
        #I change brightness of the images, just to emphasise they are unique copies.
        im=Image.eval(im,lambda x: x+(i+j)/30)
        #paste the image at location i,j:
        new_im.paste(im, (i,j))
new_im.show()


Antwoord 2, Autoriteit 18%

Uitbreiden op het grote antwoord van Fraxel, ik schreef een programma dat een map van (.png) beelden, een aantal pixels voor de breedte van de collage en het aantal foto’s per rij inneemt, en het aantal foto’s per rij en doet alle Berekeningen voor u.

#Evan Russenberger-Rosica
#Create a Grid/Matrix of Images
import PIL, os, glob
from PIL import Image
from math import ceil, floor
PATH = r"C:\Users\path\to\images"
frame_width = 1920
images_per_row = 5
padding = 2
os.chdir(PATH)
images = glob.glob("*.png")
images = images[:30]                #get the first 30 images
img_width, img_height = Image.open(images[0]).size
sf = (frame_width-(images_per_row-1)*padding)/(images_per_row*img_width)       #scaling factor
scaled_img_width = ceil(img_width*sf)                   #s
scaled_img_height = ceil(img_height*sf)
number_of_rows = ceil(len(images)/images_per_row)
frame_height = ceil(sf*img_height*number_of_rows) 
new_im = Image.new('RGB', (frame_width, frame_height))
i,j=0,0
for num, im in enumerate(images):
    if num%images_per_row==0:
        i=0
    im = Image.open(im)
    #Here I resize my opened image, so it is no bigger than 100,100
    im.thumbnail((scaled_img_width,scaled_img_height))
    #Iterate through a 4 by 4 grid with 100 spacing, to place my image
    y_cord = (j//images_per_row)*scaled_img_height
    new_im.paste(im, (i,y_cord))
    print(i, y_cord)
    i=(i+scaled_img_width)+padding
    j+=1
new_im.show()
new_im.save("out.jpg", "JPEG", quality=80, optimize=True, progressive=True)

Other episodes