URL: https://linuxfr.org/users/vmagnin/journaux/reanimation-des-tuxeries Title: Réanimation des tuxeries Authors: vmagnin Date: 2025年11月30日T20:47:53+01:00 License: CC By-SA Tags: ruffle, imagemagick, flash, bash, mit, gif et tux Score: 25 Je partage avec vous les dix-neuf animations du dessinateur JC ressuscitées du royaume des SWF, sous forme de GIF animés, grâce à un script Bash appelant Ruffle et ImageMagick. En effet, comme le disait [Glandos](https://linuxfr.org/users/glandos) en commentaire de ma [seconde étude ArkéoLogique](https://linuxfr.org/users/vmagnin/journaux/etude-arkeologique-des-tuxeries), « c'est un travail pour [Ruffle](https://ruffle.rs/) ! », un formidable effort sous licences MIT et Apache 2.0 pour dérouiller les contenus Flash à coups de Rust et WebAssembly. L'archive contenant les animations GIF est [ici](https://drop.sans-nuage.fr/r/DoN9pmSD#Kd74sKp7EpQL5WzXKwHwQyiJkPLyOvIvlwHt8P0VXdQ=) jusqu'au 30 décembre. Et pour ceux qui ont manqué un épisode, l'archive originale complète de JC est [ici](https://drop.sans-nuage.fr/r/AL4aCaDR#orhWaOe+oylHU+BIRtTXwTClUD1sCKC7b3Jkpfpuxuw=), mais seulement jusqu'au 7 décembre (le fichier est plus gros). Le script est disponible sur [Codeberg](https://codeberg.org/vmagnin/swf2gif) sous licence MIT. Pour l'instant, j'ai vraiment la flemme d'en faire un vrai outil avec une gestion d'arguments et une aide, je me suis contenté de coder en dur les répertoires utiles (Ruffle, les SWF, la sortie) et je n'ai pas essayé d'installer Ruffle dans le système. Il faut dire que je n'ai pas l'impression que je vais m'en resservir une seconde fois dans ma vie... Mais voyons maintenant les points intéressants du script. # Ruffle, l'agitateur du web On peut le tester dans l'onglet _demo_ du site ou l'installer dans son navigateur, mais on peut aussi compiler le dépôt [GitHub](https://github.com/ruffle-rs/ruffle/) du projet. On peut alors utiliser Ruffle soit sous forme d'application graphique : ```bash $ cargo run --release --package=ruffle_desktop ``` soit sous forme d'applications en ligne de commande. Bon, la compilation du projet fait un peu peur avec ses centaines de dépendances Rust, mais ça se passe bien. J'ai testé sur un vieux PC en Fedora 43. A part Rust, j'ai juste eu à installer le paquet `alsa-lib-devel` car Ruffle gère le son, en tout cas côté visualisation. Pour l'instant l'`exporter` ne semble pas gérer le son mais le projet est très actif (environ 40 commits par semaine), peut-être que ça viendra. Et dans nos 19 fichiers SWF, seuls deux comportent du son à ma connaissance : `linux-petitanim/linuxpiqueur-son.swf` et `linux-petitanim/linuxpiqueur-son02.swf`. Ruffle propose plusieurs commandes, en particulier `ruffle_scanner` qui, avec sa sous-commande `scan`, scanne un répertoire et ses sous-répertoires à la recherche de fichiers SWF et génère ensuite un fichier CSV très utile avec pleins d'informations (une ligne par fichier SWF) : ```bash cargo run --release --package=ruffle_scanner -- scan "${SWF_DIR}" "${CSV_FILE}" ``` C'est de plus facile d'itérer sur les lignes d'un CSV : ```bash for line in $(cat "${CSV_FILE}") ; do ``` et la commande `cut` permet facilement d'extraire les champs d'un CSV, par exemple ici le _framerate_ de l'animation (colonne 11) : ```bash framerate=$(echo "${line}" | cut -d ',' -f 11) ``` La commande `exporter` de Ruffle permet alors d'écrire dans un répertoire de sortie toutes les images de l'animation en PNG à la dimension voulue grâce à un facteur d'échelle : ```bash cargo run --release --package=exporter -- "${SWF_DIR}/${path}" "${OUTPUT_DIR}/${gif_dir}" --silent --frames all --scale ${scale} ``` # ImageMagick ou la magie de Noël Les GIF animés, ça fleure bon le web des années 90, quand ça clignotait de partout comme un sapin de Noël. Mais c'est justement un format simple, bien documenté, largement supporté par les logiciels actuels (navigateurs, visualiseurs, GIMP...) et compressé sans perte. Il est certes limité à 256 couleurs par image, mais dans le cas présent nous avons affaire à des dessins vectoriels avec des aplats de couleurs en nombre limité (pas de dégradé), donc ça ne pose pas de problème. Enfin, le système de compression LZW était breveté, mais les brevets sont montés au paradis du domaine public depuis belle lurette. La commande `magick` permet facilement de prendre une série de PNG et de générer un GIF animé. L'option `-delay` permet de régler la durée entre deux images, en centièmes de secondes. Il a fallu pour cela récupérer le _framerate_ dans le fichier CSV et faire le calcul avec la commande `bc`. L'option `-loop 0` permet d'obtenir une boucle infinie : ```bash magick -delay ${centiseconds} -loop 0 "${OUTPUT_DIR}/${gif_dir}/*.png" "${OUTPUT_DIR}/${gif_dir}/${name}-big.gif" magick -delay ${centiseconds} -loop 0 "${OUTPUT_DIR}/${gif_dir}/*.png" -resize 40% "${OUTPUT_DIR}/${gif_dir}/${name}-medium.gif" magick -delay ${centiseconds} -loop 0 "${OUTPUT_DIR}/${gif_dir}/*.png" -resize 16% "${OUTPUT_DIR}/${gif_dir}/${name}-small.gif" ``` J'ai utilisé l'option `-resize` pour obtenir des versions _medium_ et _small_ de chaque GIF. Dans un premier temps, j'avais utilisé Ruffle pour exporter en différentes tailles, mais faire faire le travail par ImageMagick à partir de la version haute résolution permet d'obtenir de petites images avec des contours lissés. # L'homme qui valait 350 millions (de francs) C'est mon estimation : nous sommes encore loin des trois milliards, sachant qu'il reste 140 fichiers FLA à convertir. La reconstruction de l'homme bionique a à peine commencé. L'opération continue et on entre dans la partie délicate. Le format FLA, c'est le format Flash de travail, propriétaire, à partir duquel on exportait des SWF lisibles par les navigateurs. ![Work in progress](https://codeberg.org/vmagnin/swf2gif/raw/commit/70d0fa6deae1c806e543fdc798f41bea5a28395a/linuxpiqueur02-small.gif "Un Tux animé avec un marteau-piqueur") Je vais contacter JC pour lui demander s'il se souvient quel logiciel il avait utilisé à l'époque et s'il a encore un vieux numéro de licence qui traîne quelque part. Il y a des chances que ce soit _Macromedia Flash 4_ (1999). En effet, Ruffle indique que les fichiers sont en SWF version 4 dans le CSV. De plus, le répertoire contenant les dessins de JC contient un fichier `linux/muletux.exe`, embarquant apparemment son propre Flash Player, et la commande `strings --encoding={b,l} muletux.exe` me permet de détecter les chaînes « Flash Player 4.0 » et « Copyright (C) 1996-99 Macromedia, Inc. ». J'ai aussi repéré quelques projets à explorer sur GitHub concernant les FLA et XFL (fichiers non compressés), mais avec moins d'espoir que pour les SWF. Enfin, le projet étant loin d'être abouti, je n'ai pas encore bien réfléchi à l'archivage de ces fichiers pour les siècles des siècles. Faut-il faire un dépôt sur une forge comme Codeberg ? Ou les déposer sur un site comme Wikimedia Commons ? Un par un :-( ? Quelle est votre opinion ? Avez-vous d'autres idées ? # Pour en savoir plus - https://fr.wikipedia.org/wiki/Ruffle - En anglais, [to ruffle](https://www.linguee.fr/francais-anglais/search?source=auto&query=ruffle) veut dire froisser, mais aussi ébouriffer, agiter, comme un oiseau qui secoue ses plumes. - https://en.wikipedia.org/wiki/SWF - https://en.wikipedia.org/wiki/Adobe_Flash - https://usage.imagemagick.org/anim_basics/ - Exemple d'extraction des images d'un GIF animé : `magick linux-marche02-big.gif image.png`

AltStyle によって変換されたページ (->オリジナル) /