groueix's picture
looks better, can still be improved
255a121
raw
history blame
5.23 kB
"""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()