Idées & Tutos
Un projet plus "informatique" mais toujours artistique !
J’ai récemment eu envie de conserver des dialogues de Moonstone Island. Et une simple série de captures d’écran s’est finalement transformée en un projet créatif mêlant détourage automatique, illustrations personnalisées et mise en page sous forme de BD ! Ou quand l'inspiration vient de là où on ne l'attend pas.
L'idée de départ
J'ai découvert au fil du jeu qu'on pouvait développer ses liens avec les habitants. J'ai commencé avec Tobin, le pêcheur, et j'ai réalisé des captures des dialogues. Allez savoir pourquoi : encore des fichiers à stocker... Bref je me suis vite rendue compte que ça tournait aux rancards mignons.
Et la présentation des dialogues m'a tellement faite penser à une BD, que mon cerveau de créatrice est parti en vrille jusqu'à l'étape de comment en faire la reliure 😅

Le détourage automatique
C'était le plus gros obstacle. J’ai utilisé ChatGPT pour m’aider à créer un script Python permettant d’automatiser cette étape. Je ne suis pas développeuse. Je me suis contentée de décrire le résultat souhaité et l’IA m’a aidée à construire l’outil. Descriptif succinct :
- Création du "masque" : détourage manuel d'une capture sous Microsoft Paint (bords blancs à garder, intérieur noir à rendre transparent), élargissement des bords pour palier aux approximations des contours de mes captures d'écran.
- Enregistrement d'une capture de référence de la même taille.
- Élaboration d'un script par ia : coordonnées d'un point de référence (bande violette) sur l'image de référence, appliquées au "masque" (image détourée manuellement). Puis le script trouve les coordonnées sur la capture à détourer et pose le masque dessus.
Voici pour illustration : le masque et le script python.

from pathlib import Path
from PIL import Image
import numpy as np
DOSSIER = Path.home() / "Desktop" / "Moonstone_detourage"
captures_dir = DOSSIER / "captures"
sorties_dir = DOSSIER / "sorties"
masque_path = DOSSIER / "masque.png"
reference_path = DOSSIER / "reference.png"
sorties_dir.mkdir(exist_ok=True)
def trouver_bandeau_violet(image):
"""Trouve le coin supérieur gauche du bandeau violet du nom."""
img = image.convert("RGB")
arr = np.array(img)
r = arr[:, :, 0].astype(int)
g = arr[:, :, 1].astype(int)
b = arr[:, :, 2].astype(int)
violet = (
(r > 80) &
(r < 170) &
(g > 20) &
(g < 100) &
(b > 170) &
(b < 255) &
(b > r + 40) &
(r > g + 30)
)
ys, xs = np.where(violet)
if len(xs) == 0:
raise ValueError("Impossible de trouver le bandeau violet.")
x1 = int(np.percentile(xs, 1))
y1 = int(np.percentile(ys, 1))
return x1, y1
reference = Image.open(reference_path).convert("RGB")
masque = Image.open(masque_path).convert("RGB")
if reference.size != masque.size:
raise ValueError(
f"reference.png et masque.png doivent avoir la même taille. "
f"Référence : {reference.size}, masque : {masque.size}"
)
ref_repere_x, ref_repere_y = trouver_bandeau_violet(reference)
masque_arr = np.array(masque)
# Noir = on garde l'image originale
# Blanc = on remplace par du blanc
zone_a_garder = np.mean(masque_arr[:, :, :3], axis=2) < 128
for fichier in captures_dir.iterdir():
if fichier.suffix.lower() not in [".png", ".jpg", ".jpeg"]:
continue
image = Image.open(fichier).convert("RGBA")
img_arr = np.array(image)
repere_x, repere_y = trouver_bandeau_violet(image)
position_masque_x = repere_x - ref_repere_x
position_masque_y = repere_y - ref_repere_y
hauteur, largeur = img_arr.shape[:2]
resultat = np.zeros((hauteur, largeur, 4), dtype=np.uint8)
# Fond transparent
resultat[:, :, :3] = 255
resultat[:, :, 3] = 0
masque_hauteur, masque_largeur = zone_a_garder.shape
for my in range(masque_hauteur):
y = position_masque_y + my
if y < 0 or y >= hauteur:
continue
for mx in range(masque_largeur):
x = position_masque_x + mx
if x < 0 or x >= largeur:
continue
if zone_a_garder[my, mx]:
resultat[y, x] = img_arr[y, x]
sortie = sorties_dir / f"{fichier.stem}_detoure.png"
Image.fromarray(resultat).save(sortie)
print(f"OK : {fichier.name} → {sortie.name}")
print("Terminé.")Mise en page
Dans Canva, sur un document A5 portrait. Et pourquoi faire simple quand on peut faire compliqué ? Alors pour plus d'harmonie visuelle j'ai retourné en miroir une bulle de conversation sur deux (en masquant et remplaçant le texte qui était à l'envers). J'ai également regroupé les lignes de dialogues correspondant à la même expression du personnage.
Et au moment d'intégrer les réponses qu'on choisi pour continuer la conversation : poser une simple fenêtre de choix aurait dénoté avec l'ensemble.
J'ai donc créé quelques bustes de mon personnage par ia pour rendre l'ensemble plus naturel.
Résultat

Hé BAM ! Prend-toi ça Tobin 😂
Vous pouvez télécharger le fichier de Moonstone Island, BD fan art ici :

