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, ainsi qu’Inkscape.

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] [-c] [-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.
  • L’option -c permet d’utiliser Inkscape pour cropper (c’est-à-dire rogner l’image) à son contenu (supprimer le blanc autour de l’image).

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).
  5. Si l’option -c est passée au script, alors, Inkscape est lancé en batch-process (sans interface graphique) pour cropper les images SVG avant leur conversion en GIF.
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
crop=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:c"

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
      ;;
    c)
      crop=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    
    
    if [ $crop -eq 1 ] 
    then
        echo "Conversion du fichier $fichier vers $outputDir/$prefixe$numeroFormat.svg"
        inkscape --batch-process --export-area-drawing --export-plain-svg --export-filename=$outputDir/$prefixe$numeroFormat.svg $prefixe$numero.svg    
        echo "Conversion du fichier $fichier vers $outputDir/$prefixe$numeroFormat.$imgType"    
        convert -units PixelsPerInch -density $densite  $outputDir/$prefixe$numeroFormat.svg $outputDir/$prefixe$numeroFormat.$imgType
    else
        echo "Conversion du fichier $fichier vers $outputDir/$prefixe$numeroFormat.$imgType"
        convert -units PixelsPerInch -density $densite  $prefixe$numero.svg $outputDir/$prefixe$numeroFormat.$imgType
    fi
done

# delay = duree/nbrFichier. x100 car delay pour convert est pour 100 ticks par seconde
delay=$( echo "$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 -eq 1 ] # on supprime le rep temporaire, sauf si l'option -k est donnée
then 

else
    rm -fr $outputDir
fi



Table des matières