Pourquoi ça marche spécifiquement sur GitHub
GitHub supprime les balises <script> des README et neutralise presque tout le CSS inline. Mais il affiche entièrement les fichiers SVG intégrés via une balise <img> classique, et il exécute leurs animations SMIL natives. C’est la faille exploitée ici : tout le mouvement doit vivre dans le fichier SVG lui-même, le README ne fait que pointer dessus.
Configuration
gh repo create <votre-username> --public --clone
cd <votre-username>
pip install pillow numpy opencv-python-headless rembg onnxruntime
Le premier lancement télécharge un modèle de suppression d’arrière-plan d’environ 176 Mo, une seule fois.
Le pipeline en quatre étapes
Chaque étape existe parce que la sauter dégrade visiblement le résultat.
1. Découper l’arrière-plan
rembg isole le sujet. Tout ce qui est hors du sujet est forcé en blanc pur, qui correspond à l’extrémité vide de la rampe de caractères. Sans cette étape, l’arrière-plan se remplit de caractères denses et noie le portrait.
2. CLAHE pour le contraste local
Égalisation d’histogramme adaptative à contraste limité. L’autocontraste classique agit globalement et laisse un visage uniformément éclairé en un seul ton moyen plat. CLAHE booste le contraste par tuile, donnant de vrais reflets et ombres au visage. Une limite de contraste entre 2,2 et 3,0 est la plage utile, au-delà ça amplifie la texture de peau en bruit.
3. Convertir la luminosité en caractères
RAMP = " .`:-=+*cs#%@" # clair/épars -> sombre/dense
L’espace en tête vide l’arrière-plan. Restez en monochrome : une seule couleur de remplissage, la coloration arc-en-ciel par caractère est ce qui donne cet effet « parasite télé » aux portraits ASCII ratés. Ajustez le gamma (1.0 à 1.4 selon la photo).
4. Animer la frappe
Chaque ligne est enveloppée dans un clip-path dont la largeur s’anime de 0 à sa valeur complète. Un petit bloc suit le bord comme un curseur. Les lignes sont décalées de haut en bas, et une animation « driver » auto-chaînée peut relancer toute la séquence en boucle indéfiniment.
Modes clair et sombre
.a { fill: #6e7681; }
@media (prefers-color-scheme: dark) { .a { fill: #c9d1d9; } }
Exigences sur la photo
- Lumière latérale, fenêtre à 45 degrés environ, tout le reste éteint.
- Remplissez le cadre, menton jusqu’au-dessus des cheveux.
- Fond uni, pas de noir sur fond sombre.
- Léger angle, pas de face totalement droite.
Récupérer le script
Commentez le mot-clé sous le post et je vous envoie le script complet, prêt à lancer.