J'ai été surpris aujourd'hui de constater apparemment à quel point il est difficile de passer d'un webp
animation en gif
animation. Mon GIMP 2.8.22
et ImageMagick 7.0.7-21
sur linux 4.14.13-1-ARCH
ne semblent pas prendre en charge le format, et le seul outil disponible dans les dépôts semble être libwebp 0.4.1
qui inclut un outil de décodage qui vous permet d'extraire des images individuelles dans certains formats d'image, aucun d'entre eux n'étant gif (c'est peut-être un problème de licence ?)
Quoi qu'il en soit, j'ai utilisé le script suivant :
#!/bin/bash
DELAY=${DELAY:-10}
LOOP=${LOOP:-0}
r=`realpath $1`
d=`dirname $r`
pushd $d > /dev/null
f=`basename $r`
n=`webpinfo -summary $f | grep frames | sed -e 's/.* ([0-9]*)$/1/'`
pfx=`echo -n $f | sed -e 's/^(.*).webp$/1/'`
if [ -z $pfx ]; then
pfx=$f
fi
echo "converting $n frames from $f
working dir $d
file stem '$pfx'"
for ((i=0; i<$n; i++)); do
webpmux -get frame $i $f -o $pfx.$i.webp
dwebp $pfx.$i.webp -o $pfx.$i.png
done
convert $pfx.*.png -delay $DELAY -loop $LOOP $pfx.gif
rm $pfx.[0-9]*.png $pfx.[0-9]*.webp
popd > /dev/null
Ce qui crée une animation gif à partir des images extraites du fichier fourni en premier argument.
Je l'ai essayé sur ce fichier et le fichier résultant était une sorte d'artefact. Est-il convenable de poster dans ce forum des suggestions d'amélioration de la procédure/invocations ?
Et :S'il existe des outils personnalisés pour cette conversion, merci de partager vos connaissances ! 🙂
Réponse acceptée :
Votre script fonctionne très bien, mais vous devez mettre à zéro vos noms de cadre individuels ; sinon, il crée le gif avec des cadres dans un ordre confus. J'ai corrigé cela et l'ai essayé sur quelques animations giphy webp (y compris votre exemple) et le résultat est ce à quoi vous vous attendiez.
Vous trouverez ci-dessous votre script avec deux modifications. Tout d'abord, un for
modifié boucle pour mettre à zéro ces noms de fichiers de trame. Deuxièmement, j'ai ajouté une autre vérification webpinfo pour saisir la durée de la trame et l'utiliser (si> 0) pour DELAY (en supposant naïvement que les gens n'utilisent pas de durées de trame variables):
#!/bin/bash
DELAY=${DELAY:-10}
LOOP=${LOOP:-0}
r=`realpath $1`
d=`dirname $r`
pushd $d > /dev/null
f=`basename $r`
n=`webpinfo -summary $f | grep frames | sed -e 's/.* ([0-9]*)$/1/'`
dur=`webpinfo -summary $f | grep Duration | head -1 | sed -e 's/.* ([0-9]*)$/1/'`
if (( $dur > 0 )); then
DELAY = dur
fi
pfx=`echo -n $f | sed -e 's/^(.*).webp$/1/'`
if [ -z $pfx ]; then
pfx=$f
fi
echo "converting $n frames from $f
working dir $d
file stem '$pfx'"
for i in $(seq -f "%05g" 1 $n)
do
webpmux -get frame $i $f -o $pfx.$i.webp
dwebp $pfx.$i.webp -o $pfx.$i.png
done
convert $pfx.*.png -delay $DELAY -loop $LOOP $pfx.gif
rm $pfx.[0-9]*.png $pfx.[0-9]*.webp
popd > /dev/null