Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I'm not familiar with PIL, but I know it's very easy to put a bunch of images into a grid in ImageMagick.

How do I, for example, put 16 images into a 4×4 grid where I can specify the gap between rows and columns?

like image 403
pythonee Avatar asked May 18 '12 05:05

pythonee


People also ask

How do I put two images together in Python?

Image Addition You can add two images by OpenCV function, cv2. add() or simply by numpy operation, res = img1 + img2 . Both images should be of same depth and type, or second image can just be a scalar value.

How do you put pictures on a pillow?

To load the image, we simply import the image module from the pillow and call the Image. open(), passing the image filename. Instead of calling the Pillow module, we will call the PIL module as to make it backward compatible with an older module called Python Imaging Library (PIL).


2 Answers

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,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() 

enter image description here

like image 64
fraxel Avatar answered Sep 22 '22 03:09

fraxel


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 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) 

Model Collapse Collage

like image 38
Evan Rosica Avatar answered Sep 25 '22 03:09

Evan Rosica