Search code examples
imageopen-source

Combine/Merge every x images together with title of each pict (linux)


I have some folders containing many jpg pictures (number depends on the folder)

I would like for instance to combine every 4 pict** together with the title of the image (see pict below).

(In case there is not exactly 4 image on the last sequence, I should get the number of left picture such as 3 2 or 1)

**Ideally I could change that number to other numbers like 5 6 10 (the number I chose would depend on the context) and I could chose the number of columns (I showed 2 column in my example below)

How can i perform this on Linux command or any Linux free/open-source software?

outcome


Solution

  • As I did not find what I want I created my own python code to solve this (it's probably not the most perfects script of the century but it works)

    """
    Prints a collage according to desired number of column and rows with title of file
    Instruction
    1. Put all jpg picture in same folder [tested sucessfully on 12mb per pict]
    2. select desired columns in  NO_COL
    3. select desired rowsin in NO_ROW
    4. run the script which will output the collage with <cur_date>_export.png files
    """
    
    #import libraries
    import time
    import os
    import imageio as iio
    from matplotlib import pyplot as plt
    
    
    def render_collage(pict_file_name_list):
        """ create one collage """
        fig = plt.figure(figsize=(40, 28)) #change if needed
        cnt = 1
        for cur_img_name in pict_file_name_list:
            img_var = iio.imread(cur_img_name)
            fig.add_subplot(NO_COL, NO_ROW, cnt)
            plt.imshow(img_var)
            plt.axis('off')
            plt.title(cur_img_name, fontsize = 30) #change if needed
            cnt = cnt + 1
        cur_date = time.strftime("%Y-%m-%d--%H-%M-%s")
        fig.savefig(cur_date+'_export.png')
    
    
    
    NO_COL = 3
    NO_ROW = 3
    NBR_IMG_COLLAGE = NO_COL * NO_ROW
    
    img_list_name = [elem for elem in os.listdir() if 'jpg' in elem] #keep only file having .jpg
    
    
    while len(img_list_name) >= 1:
        sub_list = img_list_name[:NBR_IMG_COLLAGE]
        render_collage(sub_list)
        del img_list_name[:NBR_IMG_COLLAGE]