Dnes mě překvapilo, že jsem zjevně zjistil, jak obtížné je přejít z webp
animace do gif
animace. Můj GIMP 2.8.22
a ImageMagick 7.0.7-21
na linux 4.14.13-1-ARCH
zdá se, že formát nepodporují a zdá se, že jediným nástrojem dostupným v repozitářích je libwebp 0.4.1
který obsahuje dekódovací nástroj, který vám umožní extrahovat jednotlivé snímky do některých obrazových formátů, přičemž žádný z nich není gif (možná je to problém s licencí?)
Každopádně jsem použil následující skript:
#!/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
Což vytvoří animaci gif z extrahovaných snímků souboru dodaného v prvním argumentu.
Zkoušel jsem to na tomto souboru a výsledný soubor byl tak trochu umělý. Je správná forma zveřejňovat na tomto fóru návrhy na zlepšení procedury/vyvolání?
A:Pokud existují vlastní nástroje pro tuto konverzi, podělte se o své znalosti! 🙂
Přijatá odpověď:
Váš skript funguje dobře, ale musíte vynulovat názvy jednotlivých snímků; jinak vytvoří gif s rámečky v neuspořádaném pořadí. Opravil jsem to a vyzkoušel jsem to na několika animacích giphy webp (včetně vašeho příkladu) a výstup je takový, jaký byste očekávali.
Níže je pouze váš skript se dvěma změnami. Nejprve pozměněný for
smyčka na nulový blok ty názvy souborů snímků. Za druhé jsem přidal další kontrolu webpinfo, abych uchopil dobu trvání snímku a použil ji (pokud> 0) pro DELAY (naivně za předpokladu, že lidé nepoužívají proměnnou dobu trvání snímků):
#!/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