Script : Génération d'un GIF animé à partir d'une famille de fichier SVG

Ce script génère une fichier GIF animé à partir d'une famille de fichiers SVG numérotés.

Dépendances

Ce script utilise ImageMagick et le programme convert.

Utilisation

Supposons que l'on souhaite animer une famille d'images SVG : monimage-1.svg, monimage-2.svg, ..., monimage-360.svg.

Syntaxe générale

svgfamilytogif -f <prefix> [-d <dpi>] [-t <duree>] [-i <type d'img>] [-k] [-n <nbr digit>] [-o <output.gif>]

Exemple

svgfamilytogif -f monimage- -o monimage.gif

Fichier GIF produit par le script

Paramètre obligatoire

  • L'option -f est obligatoire (et c'est la seule) et est suivi du préfixe de notre famille d'image SVG (dans l'exemple ci-dessous, il s'agit de monimage-).

Paramètres optionnels

  • L'option -d <dpi> permet de définir la densité (-density pour convert) en dpi de l'image GIF (valeur par défaut : 200).
  • L'option -t <duree> permet de renseigner le temps, en seconde, totale d'animation souhaité (valeur par défaut : 5).
  • L'option -o <fichie de sortie> permet donner un nom de fichier GIF de sortie de notre programme (valeur par défaut : output.gif).
  • L'option -i <type d'image> permet de spécifier le format d'images temporaires par la construction du GIF animé (valeur par défaut : gif). Voir partie fonctionnement.
  • L'option -k (sans valeur qui suit) permet de ne pas supprimer le dossier temporaire, nommé tmpOutput, contenant les images temporaires permettant la construction du GIF. Voir partie fonctionnement.
  • L'option -n permet de spécifier le nombre de digit pour la numérotation des fichiers images (temporaires) (valeur par défaut : 3). Voir partie fonctionnement.

Fonctionnement

  1. Le script parcourt la liste de fichiers SVG du répertoire courant.
  2. Pour chaque fichier SVG, il est converti (avec le programme convert) dans le format d'image choisi (par défaut gif) dans un répertoire temporaire tmpOutput, en complétant avec des zéros la numérotation pour l'avoir sur un nombre constant de digits (par défaut 3).
  3. Une fois toutes les images obtenues dans le répertoires tmpOutput, le GIF animé est produit là encore avec le programme convert.
  4. Si l'option -k n'est pas passée au script, alors le dossier tmpOutput est supprimé (et avec lui les images temporaires).
img download

svgfamilytogif


#!/bin/bash
# ----------------------------------------------------------------------
# Ce petit script bash permet la production d'un gif animé à partir 
# d'une famille d'image svg nommée -id.svg avec id un entier.

# Utilisation : 
# svgfamilytogif -f  [-d ] [-t ] [-i ] [-n ] [-k] [-o ]
#
# Option -f obligatoire
# Option -k pour garder le répertoire temporaire de conversion des svg en jpg (ou autre avec option -i)
# Valeur par défaut : 
# -d : 100
# -t : 5 (secondes)
# -o : output.gif 
# -i : jpg
# -n : 3
#
# Exemple : soit la famille ber-0.svg ... ber-359.svg 
# svgfamilytogif -f ber-
# 
# 06 juillet 2021 — Maxime Chupin
# ----------------------------------------------------------------------

#duree par defaut (en seconde)
duree=5
densite=100
output=output.gif
ndigit=3
imgType=gif
keep=0

# nom du répertoire tmp de génération des images
outputDir=tmpOutput

# Define list of arguments expected in the input
optstring=":f:t:d:n:o:i:k"

while getopts ${optstring} arg; do
  case ${arg} in
    f)
      prefixe=${OPTARG}
      ;; 
    t)
      duree=${OPTARG} 
      ;;
    d)
      densite=${OPTARG} 
      ;;
    o)
      output=${OPTARG}
      ;;
    n)
      ndigit=${OPTARG}
      ;;
    i)
      imgType=${OPTARG}
      ;;
    k)
      keep=1
      ;;
    ?)
      echo "Invalid option: -${OPTARG}."
      ;;
  esac
done

# si le répertoire temporaire n'existe pas, on le crée
[[ -d $outputDir ]] || mkdir $outputDir

# on fabrique la liste des fichiers svg à traiter
liste=$(ls $prefixe*[0-9].svg)

# compteur pour le nombre de fichier
nbrFichier=0

# on renome les fichiers SVG en formattant le nombre sur $ndigit avec 
# complément à 0
for fichier in $liste
do
    ((nbrFichier=nbrFichier+1)) 
    # Récupération numéro.
    numero=$( echo $fichier | sed -n "s/$prefixe\(.*[0-9]\).svg/\1/p" )
    # Formatage sur trois chiffres avec compléments à 0.
    tailleNumero=${#numero}
    numeroFormat=$(printf "%0${ndigit}d" $((numero))) # au cas ou, on transforme la chaine $numero en entier    	
    echo "Conversion du fichier $fichier.svg vers $outputDir/$prefixe$numeroFormat.$imgType"
    convert -units PixelsPerInch -density $densite  $prefixe$numero.svg $outputDir/$prefixe$numeroFormat.$imgType
done

# delay = duree/nbrFichier. x100 car delay pour convert est pour 100 ticks par seconde
delay=$( echo "scale=4;$duree/$nbrFichier*100" | bc )

# la commande convert d'imagemagick
convert -verbose -limit memory 4GiB -limit map 4GiB -limit disk 8GiB -background "#FFFFFF"   -units PixelsPerInch -delay $delay -loop 0 $outputDir/$prefixe*.$imgType $output

if [ $keep ] # on supprime le rep temporaire, sauf si l'option -k est donnée
then 
    rm -fr $outputDir
fi



Table des matières