Ich war heute überrascht festzustellen, wie schwierig es ist, von einem webp
zu gehen Animation zu gif
Animation. Mein GIMP 2.8.22
und ImageMagick 7.0.7-21
auf linux 4.14.13-1-ARCH
scheinen das Format nicht zu unterstützen, und das einzige in Repos verfügbare Tool scheint libwebp 0.4.1
zu sein das ein Dekodierungstool enthält, mit dem Sie einzelne Frames in einige Bildformate extrahieren können, von denen keines GIF ist (vielleicht ein Lizenzproblem?)
Wie auch immer, ich habe das folgende Skript verwendet:
#!/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
Dadurch wird eine GIF-Animation aus den extrahierten Frames der im ersten Argument angegebenen Datei erstellt.
Ich habe es mit dieser Datei versucht und die resultierende Datei war eine Art Artefakt. Ist es die richtige Form, in diesem Forum Vorschläge zur Verbesserung des Verfahrens/der Aufrufe zu posten?
Und:Wenn es für diese Konvertierung eigene Tools gibt, teilen Sie bitte Ihr Wissen! 🙂
Akzeptierte Antwort:
Ihr Skript funktioniert einwandfrei, aber Sie müssen Ihre einzelnen Frame-Namen mit Nullen auffüllen. Andernfalls wird das GIF mit Rahmen in einer durcheinandergebrachten Reihenfolge erstellt. Ich habe das behoben und an ein paar Giphy-Webp-Animationen (einschließlich Ihres Beispiels) ausprobiert, und die Ausgabe entspricht Ihren Erwartungen.
Unten ist nur Ihr Skript mit zwei Änderungen. Zuerst ein veränderter for
Schleife, um diese Frame-Dateinamen mit Nullen aufzufüllen. Zweitens habe ich einen weiteren Webpinfo-Check hinzugefügt, um die Frame-Dauer zu erfassen und diese (wenn> 0) für DELAY zu verwenden (in der naiven Annahme, dass die Leute keine variablen Frame-Dauern verwenden):
#!/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