diff --git a/backend/collage.py b/backend/collage.py index e656893..3455fe0 100644 --- a/backend/collage.py +++ b/backend/collage.py @@ -31,27 +31,31 @@ def _crop_center(img: Image.Image, ratio_cible: float) -> Image.Image: def creer_strip(photos: list[Path], marge: int = 10, couleur_fond: str = "#000000", cadre: str | None = None) -> Path: - """Cree une bande portrait style pellicule (4 photos de gauche a droite). + """Cree une bande portrait style pellicule (photos empilees de haut en bas). - Pellicule noire avec perforations, photos separees par des bandes noires. - Plus large : utilise toute la hauteur d'un 10x15 paysage divise en 2. + Pellicule noire avec perforations sur les cotes, photos separees par des + bandes noires. Taille fixe 600x1800px (5x15cm a 300dpi) : c'est le format + attendu par l'imprimante en mode "10x15-2up" (PageSize ...-div2), qui + duplique et decoupe automatiquement la bande en 2 exemplaires sur une + feuille 10x15. Doit rester strictement portrait (largeur < hauteur) et a + cette taille exacte pour eviter toute rotation/etirement a l'impression. """ nb = len(photos) images = [Image.open(p) for p in photos] - # Dimensions de la bande : largeur d'un 10x15 paysage, hauteur = moitie - bande_largeur = LARGEUR_10x15_L - bande_hauteur = (HAUTEUR_10x15_L - marge) // 2 + # Dimensions de la bande : format fixe attendu par printer.py (FORMATS["10x15-2up"]) + bande_largeur = 600 + bande_hauteur = 1800 - # Zone perforations pellicule (haut et bas) - perf_hauteur = 34 - zone_photos_hauteur = bande_hauteur - perf_hauteur * 2 + # Zone perforations pellicule (gauche et droite) + perf_largeur = 34 + zone_photos_largeur = bande_largeur - perf_largeur * 2 # Taille de chaque photo dans la bande (separees par bandes noires) sep = 12 # separateur noir entre photos - espace_photos = bande_largeur - marge * 2 - sep * (nb - 1) - largeur_cellule = espace_photos // nb - hauteur_cellule = zone_photos_hauteur + espace_photos = bande_hauteur - marge * 2 - sep * (nb - 1) + hauteur_cellule = espace_photos // nb + largeur_cellule = zone_photos_largeur ratio_cellule = largeur_cellule / hauteur_cellule # Recadrer et redimensionner @@ -66,24 +70,24 @@ def creer_strip(photos: list[Path], marge: int = 10, couleur_fond: str = "#00000 draw = ImageDraw.Draw(strip) # Bords pellicule noirs (deja le fond) - # Perforations pellicule (haut) - trous blancs dans le bord noir - for px in range(marge + 10, bande_largeur - marge, 44): + # Perforations pellicule (gauche) - trous blancs dans le bord noir + for py in range(marge + 10, bande_hauteur - marge, 44): draw.rounded_rectangle( - [px, 8, px + 22, perf_hauteur - 8], + [8, py, perf_largeur - 8, py + 22], radius=5, fill=(60, 60, 60) ) - # Perforations pellicule (bas) - for px in range(marge + 10, bande_largeur - marge, 44): + # Perforations pellicule (droite) + for py in range(marge + 10, bande_hauteur - marge, 44): draw.rounded_rectangle( - [px, bande_hauteur - perf_hauteur + 8, px + 22, bande_hauteur - 8], + [bande_largeur - perf_largeur + 8, py, bande_largeur - 8, py + 22], radius=5, fill=(60, 60, 60) ) - # Coller les photos (separees par des bandes noires verticales) - x = marge + # Coller les photos (separees par des bandes noires horizontales) + y = marge for img in images_redim: - strip.paste(img, (x, perf_hauteur)) - x += largeur_cellule + sep + strip.paste(img, (perf_largeur, y)) + y += hauteur_cellule + sep if cadre: strip = appliquer_cadre_impression(strip, "strip", cadre) diff --git a/frontend/index.html b/frontend/index.html index bd5ba05..65bb2e7 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -739,7 +739,7 @@ - + diff --git a/frontend/js/camera.js b/frontend/js/camera.js index ba1dfe1..2d67b1f 100644 --- a/frontend/js/camera.js +++ b/frontend/js/camera.js @@ -87,13 +87,12 @@ function getRatioCelluleAttendu() { const nb = getNombrePhotos(); const mode = config.multi_shot?.mode || 'strip'; if (mode === 'strip') { - // Reproduit creer_strip() dans backend/collage.py - const bandeLargeur = 1800, bandeHauteurTotale = 1200, marge = 10, sep = 12, perfHauteur = 34; - const bandeHauteur = Math.floor((bandeHauteurTotale - marge) / 2); - const zonePhotosHauteur = bandeHauteur - perfHauteur * 2; - const espacePhotos = bandeLargeur - marge * 2 - sep * (nb - 1); - const largeurCellule = Math.floor(espacePhotos / nb); - return largeurCellule / zonePhotosHauteur; + // Reproduit creer_strip() dans backend/collage.py (bande portrait 600x1800, photos empilees) + const bandeLargeur = 600, bandeHauteur = 1800, marge = 10, sep = 12, perfLargeur = 34; + const zonePhotosLargeur = bandeLargeur - perfLargeur * 2; + const espacePhotos = bandeHauteur - marge * 2 - sep * (nb - 1); + const hauteurCellule = Math.floor(espacePhotos / nb); + return zonePhotosLargeur / hauteurCellule; } else { // Reproduit creer_collage() dans backend/collage.py const colonnes = 2;