How do you merge images into a canvas using PIL/Pillow? How do you merge images into a canvas using PIL/Pillow? python python

How do you merge images into a canvas using PIL/Pillow?


This is easy to do in PIL too. Create an empty image and just paste in the images you want at whatever positions you need using paste. Here's a quick example:

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,100im.thumbnail((100,100))#Iterate through a 4 by 4 grid with 100 spacing, to place my imagefor 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()

enter image description here


Expanding on the great answer by fraxel, I wrote a program which takes in a folder of (.png) images, a number of pixels for the width of the collage, and the number of pictures per row, and does all the calculations for you.

#Evan Russenberger-Rosica#Create a Grid/Matrix of Imagesimport PIL, os, globfrom PIL import Imagefrom math import ceil, floorPATH = r"C:\Users\path\to\images"frame_width = 1920images_per_row = 5padding = 2os.chdir(PATH)images = glob.glob("*.png")images = images[:30]                #get the first 30 imagesimg_width, img_height = Image.open(images[0]).sizesf = (frame_width-(images_per_row-1)*padding)/(images_per_row*img_width)       #scaling factorscaled_img_width = ceil(img_width*sf)                   #sscaled_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,0for 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+=1new_im.show()new_im.save("out.jpg", "JPEG", quality=80, optimize=True, progressive=True)

Model Collapse Collage