Exporter des fichiers SVG en PNG dans différentes tailles

Il y a quelque temps, je cherchais un thème d’icônes pour Manjaro XFCE qui convenait mieux à mes goûts. Je n’aime pas tellement la mode du « flat » pour un environnement de bureau. J’ai trouvé quelques thèmes d’icônes qui pouvaient convenir mais chacun de ces thèmes contenait des icônes qui me plaisaient moins. J’ai finalement décidé de créer mon propre thème d’icônes.

Mon problème : je me retrouve avec plusieurs dossiers contenant de nombreux fichiers SVG et il me faut ces images dans différentes tailles et en PNG.

La solution : je me suis initié à Bash et j’ai créé un script pour me simplifier la tâche.

Le script Bash

Je l’ai publié dans un Gist sur Github, mais vous pouvez aussi le copier ici :

#! /bin/bash
# exportsvgtopng.sh
# Script to export SVGs in PNGs with Inkscape.
# Originally written by Armand Philippot <contact@armandphilippot.com>.

echo -e "Ce script permet d'exporter vos fichiers SVG en PNG dans différentes tailles en utilisant Inkscape.\n"

if command -v inkscape &>/dev/null; then
    echo -e "Inkscape est bien installé, poursuivons."
else
    echo -e "Inkscape n'est pas installé.\n"
    exit 2
fi

read -p 'Saisir le chemin du dossier à traiter : ' BASEDIR
if [ -d "$BASEDIR" ]; then
    echo -e "Le dossier à traiter existe, poursuivons.\n"
    [[ "${BASEDIR}" != */ ]] && BASEDIR="${BASEDIR}/"
else
    until [ -d "$BASEDIR" ]; do
        echo -e "Le dossier à traiter n'existe pas. Veuillez saisir un chemin valide.\n"
        read -p 'Saisir le chemin du dossier à traiter : ' BASEDIR
    done
fi

read -p 'Saisir le chemin de sortie : ' OUTPATH
if [ -d "$OUTPATH" ]; then
    echo "Le chemin de sortie existe, poursuivons."
    [[ "${OUTPATH}" != */ ]] && OUTPATH="${OUTPATH}/"
else
    until [ -d "$OUTPATH" ]; do
        echo -e "Le dossier à traiter n'existe pas. Veuillez saisir un chemin valide.\n"
        read -p 'Saisir le chemin de sortie : ' OUTPATH
    done
fi

read -p 'Saisir le nombre de tailles souhaitées : ' SIZES
until [[ "$SIZES" = *([+-])*([0-9])*(.)*([0-9]) ]]; do
    echo -e "La valeur saisie n'est pas un nombre, veuillez réessayer.\n"
    read -p 'Saisir le nombre de tailles souhaitées : ' SIZES
done

echo -e "Vous allez maintenant saisir les différentes tailles souhaitées ($SIZES au total).\n"
for ((i = 1; $i < $SIZES + 1; i++)); do
    read -p "Saisir la taille $i : " SIZE[$i]
    until [[ "${SIZE[$i]}" = *([+-])*([0-9])*(.)*([0-9]) ]]; do
        echo -e "La valeur saisie n'est pas un nombre, veuillez réessayer.\n"
        read -p "Saisir la taille $i : " SIZE[$i]
    done
done

echo "Les tailles demandées sont : "
for ((i = 1; $i < $SIZES + 1; i++)); do
    echo ${SIZE[$i]}
done

echo -e "Nous allons maintenant procéder à la conversion.\n"
for dir in "${BASEDIR}"*; do
    if [ -d "$dir" ]; then
        subdir=$(basename "$dir")
        for ((i = 1; $i < $SIZES + 1; i++)); do
            SIZEDIR="${SIZE[$i]}x${SIZE[$i]}"
            mkdir -p "${OUTPATH}${SIZEDIR}/${subdir}"
            FULLOUTPATH="${OUTPATH}${SIZEDIR}/${subdir}"
            shopt -s nullglob
            for file in "$dir"/*.svg; do
                MYFILENAME=$(basename "$file" .svg)
                /usr/bin/inkscape -z -f "${file}" -e "${FULLOUTPATH}"/"${MYFILENAME}".png -C -w ${SIZE[$i]} -h ${SIZE[$i]}
            done
        done
    fi
done

echo -e "\nLes fichiers ont été convertis.\n"

Comment l’utiliser ?

Il vous suffit d’enregistrer le code dans un fichier « monscript.sh » et de le lancer dans un terminal :

sh monscript.sh

Les instructions sont en français, mais pour résumer le script va vous demander :

  • Le chemin du dossier à convertir
  • Le chemin de sortie pour les fichiers convertis
  • Le nombre de tailles à définir
  • Les différentes tailles que vous souhaitez (64 pour 64×64, 48 pour 48×48, etc.)

Le script va alors convertir vos fichiers SVG en PNG et les classer en suivant le schéma suivant « cheminDeSortie/tailleXTaille/sousRépertoire/fichier.png ».

À noter, il faut que Inkscape soit installé. De plus, le script s’attend à ce que votre dossier à convertir ait le format « dossierÀConvertir/sousRépertoire/fichier.svg ».

Comme je le précisais, je débute en Bash. Il y a sûrement des améliorations à faire mais pour un premier script, il remplit son rôle.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.