GIFs animées, les bases

Le format d'image GIF (Graphic Interchange Format) a été inventé en 1997 par Compu$erve pour la diffusion de photos de châtons sur le réseau RTC. En 1989, quelques améliorations de ce format ont vues le jour, l'une d'elle allait révolutionner les intertubes : on peut désormais faire des animations ! Une nouvelle discipline artistique était née, avec ses contraintes, ses limitations. Rapidement de nouveaux codes ont fait leurs apparitions, une foultitude de logiciels virent le jour glauque des écrans CRT.

Premier exemple

Fanny est très jolie

Pour ce premier exemple (vécu en réel sur le quai de Myrys en juillet 2013), nous partons d'une idée de base : vous disposez de quelques images de mêmes largeur/hauteur que vous souhaitez assembler en GifA. Évidemment, la première chose à faire, c'est la commande convert -delay 20 *.png lolcat.gif qui donnera rapidement un aperçu.

Mais ce n'est qu'un aperçu rapide. Que faire si les clichés d'origine nécessitent un traitement tel qu'un ajustement de contraste ou un redimensionnement ? Tout hacker qui se respecte connait la réponse : « scripter ! ». D'accord, mais scripter, ça veut dire quoi ?

Scripter, ça veut juste dire qu'il faut demander à l'ordinateur : « tu veux bien faire ça à ma place ? ». Bon, c'est pas (encore) si simple, mais pour donner un exemple, voici un petit script shell qui sert à construire ce genre de lolpic.

#!/bin/bash

SOURCE=$(cat liste)
DELAY=10

for src in $SOURCE
do
	base=$(basename $src .JPG)

	petite=/tmp/$base.png
	convert -resize 38% $src $petite

	atk=/tmp/atk_$base.png
	./atkinson.py $petite $atk
done

convert -delay $DELAY /tmp/atk_*.png foo.gif

Ça va, tout le monde comprend ? On dirait bien que non, alors je vais essayer d'expliquer un peu sans rentrer dans les détails trop gores. La structure générale d'un de nos script sera souvent la même : une première étape prépare la travail en définissant quelques valeurs, la seconde étape est une boucle qui traite successivement chaque image, et la troisième fabrique le produit final.

Première étape :

Vous avez préalablement sélectionné les images à assembler, et enregistré leurs chemins, un par ligne dans un fichier que vous avez nommé «liste». La construction SOURCE=$(cat liste) va transformer le contenu du fichier en une donnée directement exploitable par notre ami Bash.

Deuxième étape :

Nous avons donc dans la variable $SOURCE la liste des images à traiter, et nous allons boucler sur celles-ci pour les traiter une à une avec la construction for src in $SOURCE ; do grink grink ; done.

La ligne base=$(basename $src .JPG) permet de supprimer l'extension .JPG du nom de fichier (FOO.JPG deviendra FOO) et range le résultat dans la variable 'base'.

Les deux lignes suivantes servent à réduire l'image d'origine à une dimension raisonnable et en stockant le résultat dans le fichier /tmp/FOO.png pour la suite.

Et finalement nous appliquons à notre image le traitement pointilliste qui va bien, et que nous détaillerons un autre jour...

Troisième étape :

C'est bon, théoriquement notre spool est rempli de belles images qu'il ne reste plus qu'a assembler. C'est la tache de convert à qui nous donnons le délai en millisecondes (-delay $DELAY), la liste des images à chainer, et le nom du fichier de destination.

Et voilà...

J'espère que ces explications sont assez claires, et qu'elles vous auront convaincus que programmer un 'dinateur peut parfois être une activité amusante et à fort potentiel kikoololesque.