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:
@@ -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))
|
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).
|
"""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).
|
Pellicule noire avec perforations, photos separees par des bandes noires.
|
||||||
Style pellicule : bords avec perforations.
|
Plus large : utilise toute la hauteur d'un 10x15 paysage divise en 2.
|
||||||
"""
|
"""
|
||||||
nb = len(photos)
|
nb = len(photos)
|
||||||
images = [Image.open(p) for p in photos]
|
images = [Image.open(p) for p in photos]
|
||||||
|
|
||||||
# Dimensions de la bande : largeur d'un 10x15 paysage, hauteur = moitie
|
# Dimensions de la bande : largeur d'un 10x15 paysage, hauteur = moitie
|
||||||
bande_largeur = LARGEUR_10x15_L
|
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)
|
# Zone perforations pellicule (haut et bas)
|
||||||
perf_hauteur = 30
|
perf_hauteur = 34
|
||||||
zone_photos_hauteur = bande_hauteur - perf_hauteur * 2
|
zone_photos_hauteur = bande_hauteur - perf_hauteur * 2
|
||||||
|
|
||||||
# Taille de chaque photo dans la bande
|
# Taille de chaque photo dans la bande (separees par bandes noires)
|
||||||
espace_photos = bande_largeur - marge * (nb + 1)
|
sep = 12 # separateur noir entre photos
|
||||||
|
espace_photos = bande_largeur - marge * 2 - sep * (nb - 1)
|
||||||
largeur_cellule = espace_photos // nb
|
largeur_cellule = espace_photos // nb
|
||||||
hauteur_cellule = zone_photos_hauteur
|
hauteur_cellule = zone_photos_hauteur
|
||||||
ratio_cellule = largeur_cellule / hauteur_cellule
|
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)
|
img_redim = img_crop.resize((largeur_cellule, hauteur_cellule), Image.LANCZOS)
|
||||||
images_redim.append(img_redim)
|
images_redim.append(img_redim)
|
||||||
|
|
||||||
# Creer la bande
|
# Creer la bande (fond noir = pellicule)
|
||||||
strip = Image.new("RGB", (bande_largeur, bande_hauteur), couleur_fond)
|
strip = Image.new("RGB", (bande_largeur, bande_hauteur), (20, 20, 20))
|
||||||
draw = ImageDraw.Draw(strip)
|
draw = ImageDraw.Draw(strip)
|
||||||
|
|
||||||
# Perforations pellicule (haut)
|
# Bords pellicule noirs (deja le fond)
|
||||||
for px in range(marge, bande_largeur - marge, 40):
|
# Perforations pellicule (haut) - trous blancs dans le bord noir
|
||||||
|
for px in range(marge + 10, bande_largeur - marge, 44):
|
||||||
draw.rounded_rectangle(
|
draw.rounded_rectangle(
|
||||||
[px, 6, px + 20, perf_hauteur - 6],
|
[px, 8, px + 22, perf_hauteur - 8],
|
||||||
radius=4, fill=(30, 30, 30)
|
radius=5, fill=(60, 60, 60)
|
||||||
)
|
)
|
||||||
# Perforations pellicule (bas)
|
# 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(
|
draw.rounded_rectangle(
|
||||||
[px, bande_hauteur - perf_hauteur + 6, px + 20, bande_hauteur - 6],
|
[px, bande_hauteur - perf_hauteur + 8, px + 22, bande_hauteur - 8],
|
||||||
radius=4, fill=(30, 30, 30)
|
radius=5, fill=(60, 60, 60)
|
||||||
)
|
)
|
||||||
|
|
||||||
# Bords pellicule
|
# Coller les photos (separees par des bandes noires verticales)
|
||||||
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
|
|
||||||
x = marge
|
x = marge
|
||||||
for img in images_redim:
|
for img in images_redim:
|
||||||
strip.paste(img, (x, perf_hauteur))
|
strip.paste(img, (x, perf_hauteur))
|
||||||
x += largeur_cellule + marge
|
x += largeur_cellule + sep
|
||||||
|
|
||||||
nom = f"strip_{photos[0].stem}.jpg"
|
nom = f"strip_{photos[0].stem}.jpg"
|
||||||
chemin = DOSSIER_EXPORTS / nom
|
chemin = DOSSIER_EXPORTS / nom
|
||||||
|
|||||||
Reference in New Issue
Block a user