import argparse from copaint.copaint import image_to_pdf # from copaint import image_to_copaint_pdf from PIL import Image import numpy as np import random actual_participants_over_participants = 0.7 # how many people actually show up compared to the number of participants # Default list of identifiers default_identifiers_en = [ "sunshine", "bliss", "smile", "serenity", "laughter", "breeze", "harmony", "glee", "cheer", "delight", "hope", "sparkle", "kindness", "charm", "grace", "radiance", "jubilee", "flutter", "playful", "whimsy", "gleam", "glow", "twinkle", "love", "joy", "peace", "cheeky", "amity", "blissful", "grateful" ] default_identifiers_fr = [ "soleil", # sunshine "joie", # joy "bise", # soft breeze / kiss "charmant", # charming "éclat", # sparkle / brilliance "rêve", # dream "douceur", # softness / sweetness "espoir", # hope "lueur", # glow "gaieté", # cheerfulness "plume", # feather "bisou", # kiss "amour", # love "paix", # peace "rosée", # dew "bulle", # bubble "câlin", # cuddle "grâce", # grace "mistral", # southern wind "lumière", # light "frisson", # shiver (pleasant) "azur", # blue sky "rire", # laughter ] # Function to get a default identifier (random or specified) def default_identifier(index=None, language="en"): """ Get a default identifier from the list. Args: index: Optional index to get a specific identifier. If None, returns a random identifier. Returns: str: A default identifier """ if language == "en": if index is not None and 0 <= index < len(default_identifiers_fr): return default_identifiers_fr[index] return random.choice(default_identifiers_fr) elif language == "fr": if index is not None and 0 <= index < len(default_identifiers_en): return default_identifiers_en[index] return random.choice(default_identifiers_en) def get_grid_size(nparticipants, input_image): """ Takes the number of participants and the input image and returns the grid size, with the objective of making each cell as square as possible.""" # get the dimensions of the input image, load with PIL input_image = Image.open(input_image) w, h = input_image.size n_cell = nparticipants * actual_participants_over_participants aspect_ratio = w/h h_cells = np.sqrt(aspect_ratio * n_cell) w_cells = aspect_ratio * h_cells """ We have the following equations: (1) w_cells/h_cells = aspect_ratio (as close as possible up to w_cells and h_cells being integers) (2) h_cells * w_cells = n_cell Solving to (1) w_cells = aspect_ratio * h_cells # replace in (2) (2) h_cells * aspect_ratio * h_cells = n_cell Leads to (3) h_cells^2 * aspect_ratio = n_cell Leads to h_cells = sqrt(n_cell / aspect_ratio) """ h_cells = np.round(np.sqrt(n_cell / aspect_ratio)) w_cells = np.round(aspect_ratio * h_cells) # convert to integers h_cells = int(h_cells) w_cells = int(w_cells) print(f"Using {h_cells} x {w_cells} = {h_cells*w_cells} grid size for a canvas of size {h}*{w} and {nparticipants} participants (actual {n_cell})") return int(h_cells), int(w_cells) def main(): parser = argparse.ArgumentParser(description='CoPaint') parser.add_argument('--input_image', type=str, default='./data/bear.png', help='input image') parser.add_argument('--copaint_logo', type=str, default='./data/logo_copaint.png', help='copaint logo') parser.add_argument('--outputfolder', type=str, default='output/', help='output image') parser.add_argument('--nparticipants', type=int, help='number of participants', default=None) parser.add_argument('--h_cells', type=int, help='number of cells in height', default=None) parser.add_argument('--w_cells', type=int, help='number of cells in width', default=None) parser.add_argument('--unique_identifier', type=str, help='unique identifier like Mauricette, in case users are doing multiple copaint at the same time, to avoid mixing the tiles', default=None) parser.add_argument('--cell_size_in_cm', type=float, default=None, help='size of a cell in cm, for printing purposes') parser.add_argument('--use_presets', action='store_true', help='use a couple of presets cuts based on the size of the number of people attending') parser.add_argument('--a4', action='store_true', help='use A4 format for the pdf') parser.add_argument('--high_res', action='store_true', help='save in high resolution mode (PNG format without resizing)') parser.add_argument('--min_cell_size_in_cm', type=int, default=2, help='minimum size of cells in cm') parser.add_argument('--debug', action='store_true', help='debug mode') # done adding arguments args = parser.parse_args() if args.unique_identifier is None: # select one at random idx = np.random.choice(len(default_identifiers), 1) args.unique_identifier = default_identifiers[idx[0]] presets = [ [2, 3], # 6 people [3, 3], # 9 people [3, 4], # 12 people [4, 4], # 16 people [4, 5], # 20 people [4, 6], # 24 people [5, 6], # 30 people [6, 8], # 48 people [7, 9], # 63 people [7, 10], # 70 people [8, 10], # 80 people [8, 12], # 96 people ] preset_number_of_guests = [presets[i][0]*presets[i][1] for i in range(len(presets))] # generate all presets if args.use_presets: # disregard other parameters and use the presets # assert other parameters are not set assert(args.h_cells is None), "When using presets, the number of H cells can't be set" assert(args.w_cells is None), "When using presets, the number of W cells can't be set" assert(args.nparticipants is None), "When using presets, the number of participants can't be set" for preset in presets: image_to_pdf(args.input_image, args.copaint_logo, args.outputfolder, preset[0], preset[1], unique_identifier=args.unique_identifier, cell_size_in_cm=args.cell_size_in_cm, a4=args.a4, high_res=args.high_res, min_cell_size_in_cm=args.min_cell_size_in_cm, debug=args.debug) # generate a copaint pdf based on the number of participants elif args.nparticipants: # assert other parameters are not set assert(args.h_cells is None), "When choosing via number of participants, the number of H cells can't be set" assert(args.w_cells is None ), "When choosing via number of participants, the number of W cells can't be set" # get the grid size based on the number of participants h_cells, w_cells = get_grid_size(args.nparticipants, args.input_image) image_to_pdf(args.input_image, args.copaint_logo, args.outputfolder, h_cells, w_cells, unique_identifier=args.unique_identifier, cell_size_in_cm=args.cell_size_in_cm, a4=args.a4, high_res=args.high_res, min_cell_size_in_cm=args.min_cell_size_in_cm, debug=args.debug) # # Depracated find the first preset that can accomodate the number of participants # preset_number_of_guests_inflated_by_losers = actual_participants_over_participants*args.nparticipants # for i, preset in enumerate(presets): # if preset_number_of_guests_inflated_by_losers <= preset_number_of_guests[i]: # print(f"Using preset {preset} for {args.nparticipants} participants") # image_to_copaint_pdf(args.input_image, args.copaint_logo, args.outputfolder, preset[0], preset[1]) # break # Generate the copaint pdf using the specified number of cells else: image_to_pdf(args.input_image, args.copaint_logo, args.outputfolder, args.h_cells, args.w_cells, unique_identifier=args.unique_identifier, cell_size_in_cm=args.cell_size_in_cm, a4=args.a4, high_res=args.high_res, min_cell_size_in_cm=args.min_cell_size_in_cm, debug=args.debug) if __name__ == '__main__': main()