Cadres impression : fallback cross-format (15x20 utilise le 10x15 si pas de cadre dédié)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -121,18 +121,32 @@ def chroma_key(chemin_photo: Path, nom_fond: str | None = None,
|
||||
return chemin_export
|
||||
|
||||
|
||||
def appliquer_cadre_impression(img: Image.Image, format_papier: str, nom_cadre: str, event_id: str | None = None) -> Image.Image:
|
||||
"""Composite un cadre PNG par-dessus l'image assemblée."""
|
||||
chemin = None
|
||||
def _chercher_cadre(format_papier: str, nom_cadre: str, event_id: str | None = None) -> Path | None:
|
||||
"""Cherche le cadre dans le format demandé, sinon fallback autres formats."""
|
||||
candidats = []
|
||||
if event_id:
|
||||
from backend.evenements import DOSSIER_EVENEMENTS
|
||||
chemin_event = DOSSIER_EVENEMENTS / event_id / "cadres" / format_papier / nom_cadre
|
||||
if chemin_event.exists():
|
||||
chemin = chemin_event
|
||||
base_event = DOSSIER_EVENEMENTS / event_id / "cadres"
|
||||
candidats.append(base_event / format_papier / nom_cadre)
|
||||
for d in sorted(base_event.iterdir()) if base_event.exists() else []:
|
||||
if d.is_dir() and d.name != format_papier:
|
||||
candidats.append(d / nom_cadre)
|
||||
candidats.append(DOSSIER_CADRES / format_papier / nom_cadre)
|
||||
for d in sorted(DOSSIER_CADRES.iterdir()) if DOSSIER_CADRES.exists() else []:
|
||||
if d.is_dir() and d.name != format_papier:
|
||||
candidats.append(d / nom_cadre)
|
||||
for c in candidats:
|
||||
if c.exists():
|
||||
return c
|
||||
return None
|
||||
|
||||
|
||||
def appliquer_cadre_impression(img: Image.Image, format_papier: str, nom_cadre: str, event_id: str | None = None) -> Image.Image:
|
||||
"""Composite un cadre PNG par-dessus l'image assemblée.
|
||||
Si le cadre n'existe pas dans le format demandé, utilise celui d'un autre format (resize)."""
|
||||
chemin = _chercher_cadre(format_papier, nom_cadre, event_id)
|
||||
if chemin is None:
|
||||
chemin = DOSSIER_CADRES / format_papier / nom_cadre
|
||||
if not chemin.exists():
|
||||
log.warning(f"Cadre introuvable : {chemin}")
|
||||
log.warning(f"Cadre introuvable : {nom_cadre} pour {format_papier}")
|
||||
return img
|
||||
cadre = Image.open(chemin).convert("RGBA")
|
||||
img_portrait = img.height > img.width
|
||||
@@ -147,11 +161,16 @@ def appliquer_cadre_impression(img: Image.Image, format_papier: str, nom_cadre:
|
||||
|
||||
|
||||
def lister_cadres(format_papier: str) -> list[str]:
|
||||
"""Liste les cadres disponibles pour un format donné."""
|
||||
"""Liste les cadres disponibles pour un format. Inclut ceux d'autres formats en fallback."""
|
||||
noms = set()
|
||||
dossier = DOSSIER_CADRES / format_papier
|
||||
if not dossier.exists():
|
||||
return []
|
||||
return sorted(f.name for f in dossier.iterdir() if f.suffix.lower() == ".png")
|
||||
if dossier.exists():
|
||||
noms.update(f.name for f in dossier.iterdir() if f.suffix.lower() == ".png")
|
||||
if not noms and DOSSIER_CADRES.exists():
|
||||
for d in DOSSIER_CADRES.iterdir():
|
||||
if d.is_dir():
|
||||
noms.update(f.name for f in d.iterdir() if f.suffix.lower() == ".png")
|
||||
return sorted(noms)
|
||||
|
||||
|
||||
def lister_overlays() -> list[str]:
|
||||
|
||||
Reference in New Issue
Block a user