from collections import Counter from PIL import Image from math import isqrt, ceil from typing import List def make_grid(image_list: List): """ Creates a square image by combining multiple images in a grid pattern. Args: image_list (list): List of PIL Image objects to be combined. Returns: PIL Image object: The resulting square image. None: If the image_list is empty or contains only one image. """ # Count the occurrences of each image size in the image_list size_counter = Counter(image.size for image in image_list) # Get the most common image size (size with the highest count) common_size = size_counter.most_common(1)[0][0] # Filter the image_list to include only images with the common size image_list = [image for image in image_list if image.size == common_size] # Get the dimensions (width and height) of the common size size = common_size # If there are more than one image in the image_list if len(image_list) > 1: num_images = len(image_list) # Calculate the number of rows and columns for the grid rows = isqrt(num_images) cols = ceil(num_images / rows) # Calculate the size of the square image square_size = (cols * size[0], rows * size[1]) # Create a new RGB image with the square size square_image = Image.new("RGB", square_size) # Paste each image onto the square image at the appropriate position for i, image in enumerate(image_list): row = i // cols col = i % cols square_image.paste(image, (col * size[0], row * size[1])) # Return the resulting square image return square_image # Return None if there are no images or only one image in the image_list return None