Oggi sono stato sorpreso di scoprire quanto sia difficile passare da un webp
animazione in gif
animazione. Il mio GIMP 2.8.22
e ImageMagick 7.0.7-21
su linux 4.14.13-1-ARCH
non sembra supportare il formato e l'unico strumento disponibile nei repository sembra essere libwebp 0.4.1
che include uno strumento di decodifica che ti consente di estrarre singoli fotogrammi in alcuni formati di immagine, nessuno dei quali è gif (forse è un problema di licenza?)
Ad ogni modo, ho usato il seguente script:
#!/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
Che crea un'animazione gif dai fotogrammi estratti del file fornito nel primo argomento.
L'ho provato su questo file e il file risultante era una specie di artefatto. È una forma adeguata per postare in questo forum suggerimenti di miglioramento della procedura/invocazioni?
E:se ci sono strumenti personalizzati per questa conversione, condividi le tue conoscenze! 🙂
Risposta accettata:
Il tuo script funziona bene, ma devi azzerare i nomi dei tuoi frame individuali; altrimenti crea la gif con cornici in un ordine confuso. L'ho risolto e l'ho provato su alcune animazioni giphy webp (incluso il tuo esempio) e l'output è quello che ti aspetteresti.
Di seguito è riportato solo il tuo script con due modifiche. Innanzitutto, un for
modificato ciclo per azzerare quei nomi di file di frame. In secondo luogo, ho aggiunto un altro controllo webpinfo per acquisire la durata del frame e utilizzarla (se> 0) per DELAY (supponendo ingenuamente che le persone non stiano utilizzando durate di frame variabili):
#!/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