Strip pellicule noir + bandes verticales noires entre photos

- Fond noir (pellicule)
- Separateurs noirs entre les photos
- Plus large (utilise toute la hauteur disponible)
- Perforations grises sur bord noir

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-04-07 17:59:14 +02:00
parent 99d2dc8f56
commit 19768edd43

View File

@@ -28,25 +28,26 @@ def _crop_center(img: Image.Image, ratio_cible: float) -> Image.Image:
return img.crop((0, offset, img.width, offset + nouvelle_hauteur))
def creer_strip(photos: list[Path], marge: int = 20, couleur_fond: str = "#ffffff") -> Path:
def creer_strip(photos: list[Path], marge: int = 10, couleur_fond: str = "#000000") -> Path:
"""Cree une bande portrait style pellicule (4 photos de gauche a droite).
La bande fait la moitie d'un 10x15 paysage (1800 x 570px environ).
Style pellicule : bords avec perforations.
Pellicule noire avec perforations, photos separees par des bandes noires.
Plus large : utilise toute la hauteur d'un 10x15 paysage divise en 2.
"""
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 * 3) // 2 # 2 bandes par page
bande_hauteur = (HAUTEUR_10x15_L - marge) // 2
# Zone perforations pellicule (haut et bas)
perf_hauteur = 30
perf_hauteur = 34
zone_photos_hauteur = bande_hauteur - perf_hauteur * 2
# Taille de chaque photo dans la bande
espace_photos = bande_largeur - marge * (nb + 1)
# 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
ratio_cellule = largeur_cellule / hauteur_cellule
@@ -58,41 +59,29 @@ def creer_strip(photos: list[Path], marge: int = 20, couleur_fond: str = "#fffff
img_redim = img_crop.resize((largeur_cellule, hauteur_cellule), Image.LANCZOS)
images_redim.append(img_redim)
# Creer la bande
strip = Image.new("RGB", (bande_largeur, bande_hauteur), couleur_fond)
# Creer la bande (fond noir = pellicule)
strip = Image.new("RGB", (bande_largeur, bande_hauteur), (20, 20, 20))
draw = ImageDraw.Draw(strip)
# Perforations pellicule (haut)
for px in range(marge, bande_largeur - marge, 40):
# 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):
draw.rounded_rectangle(
[px, 6, px + 20, perf_hauteur - 6],
radius=4, fill=(30, 30, 30)
[px, 8, px + 22, perf_hauteur - 8],
radius=5, fill=(60, 60, 60)
)
# Perforations pellicule (bas)
for px in range(marge, bande_largeur - marge, 40):
for px in range(marge + 10, bande_largeur - marge, 44):
draw.rounded_rectangle(
[px, bande_hauteur - perf_hauteur + 6, px + 20, bande_hauteur - 6],
radius=4, fill=(30, 30, 30)
[px, bande_hauteur - perf_hauteur + 8, px + 22, bande_hauteur - 8],
radius=5, fill=(60, 60, 60)
)
# Bords pellicule
draw.rectangle([0, 0, bande_largeur - 1, perf_hauteur], fill=(40, 40, 40))
draw.rectangle([0, bande_hauteur - perf_hauteur, bande_largeur - 1, bande_hauteur - 1],
fill=(40, 40, 40))
# Re-dessiner les perforations par-dessus les bords
for px in range(marge, bande_largeur - marge, 40):
draw.rounded_rectangle([px, 6, px + 20, perf_hauteur - 6], radius=4, fill=couleur_fond)
draw.rounded_rectangle(
[px, bande_hauteur - perf_hauteur + 6, px + 20, bande_hauteur - 6],
radius=4, fill=couleur_fond
)
# Coller les photos
# Coller les photos (separees par des bandes noires verticales)
x = marge
for img in images_redim:
strip.paste(img, (x, perf_hauteur))
x += largeur_cellule + marge
x += largeur_cellule + sep
nom = f"strip_{photos[0].stem}.jpg"
chemin = DOSSIER_EXPORTS / nom