File size: 5,229 Bytes
255a121
 
bf62248
 
255a121
bf62248
255a121
 
 
 
 
 
 
 
 
 
 
bf62248
255a121
 
bf62248
 
255a121
 
 
bf62248
 
255a121
 
 
 
 
 
 
bf62248
 
255a121
 
 
 
 
 
 
 
 
bf62248
255a121
 
 
 
 
bf62248
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255a121
 
bf62248
 
 
 
 
255a121
bf62248
 
255a121
bf62248
 
 
 
 
 
 
 
 
 
 
 
 
 
 
255a121
bf62248
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""Command line interface for Copaint pdf generator.
"""
import argparse
import numpy as np
import logging

from copaint.copaint import image_to_pdf

# Configure logging
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s',
    datefmt='%Y-%m-%d %H:%M:%S'
)
logger = logging.getLogger(__name__)

# Default identifiers for unique_identifier parameter
default_identifiers = [
    "Mauricette", "Gertrude", "Bernadette", "Henriette", "Georgette", "Antoinette", "Colette", "Suzette", "Yvette", "Paulette",
    "Juliette", "Odette", "Marinette", "Lucette", "Pierrette", "Cosette", "Rosette", "Claudette", "Violette", "Josette"
]

def default_identifier():
    """Return a random default identifier."""
    return np.random.choice(default_identifiers)

def get_grid_size(nparticipants, input_image):
    """Get grid size based on number of participants."""
    # Compute the grid size based on the number of participants
    # We want to find h_cells and w_cells such that h_cells * w_cells >= nparticipants
    # and h_cells/w_cells is close to the aspect ratio of the image
    from PIL import Image
    image = Image.open(input_image)
    w, h = image.size
    aspect_ratio = w/h
    
    # Find the smallest grid that can accommodate nparticipants
    min_cells = int(np.ceil(np.sqrt(nparticipants)))
    for i in range(min_cells, min_cells+10):
        for j in range(min_cells, min_cells+10):
            if i*j >= nparticipants:
                ratio = j/i
                if abs(ratio - aspect_ratio) < 0.2:
                    logger.info(f"Found grid size {i}x{j} for {nparticipants} participants")
                    return i, j
    
    # If no good ratio is found, just use the smallest grid that can accommodate nparticipants
    h_cells = min_cells
    w_cells = int(np.ceil(nparticipants/min_cells))
    logger.warning(f"No good aspect ratio found. Using {h_cells}x{w_cells} grid for {nparticipants} participants")
    return h_cells, 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')
    
    args = parser.parse_args()

    if args.debug:
        logger.setLevel(logging.DEBUG)
    
    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]]
        logger.info(f"Using random identifier: {args.unique_identifier}")
    
    # generate a copaint pdf based on the number of participants
    if 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)
    
    # 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()