webp animation to gif animation (cli)
Solution 1
Running into the same issue myself, I found that using Python and its Pillow library might be the easiest way. Just import it, let it load the image file, and directly save it again with appropriate options.
from PIL import Image
im = Image.open('your_file.webp')
im.save('your_file.gif', 'gif', save_all=True, optimize=True, background=0)
Tested with Python3.8 and Pillow 8.0.1. You might have to install or upgrade the library first, using e.g. python3 -m pip install --user --upgrade Pillow
All on one line to batch convert all *.webp
files in the current folder to *.gif
with the same name:
for f in *.webp;do echo "$f";python3 -c "from PIL import Image;Image.open('$f').save('${f%.webp}.gif','gif',save_all=True,optimize=True,background=0)";done
Note: This answer was inspired by Stack Overflow.
Solution 2
Your script works just fine, but you need to zero pad your individual frame names; otherwise it creates the gif with frames in a jumbled order. I fixed that and tried it on a few giphy webp animations (including your example) and the output is what you'd expect.
Below is just your script with two changes. First, an altered for
loop to zero pad those frame filenames. Second, I added another webpinfo check to grab the frame duration and use that (if > 0) for DELAY (naively assuming that people aren't using variable frame durations):
#!/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
Solution 3
I would have used ffmpeg
for this task. Have a look at this thread which should give you good results.
I tried with the mp4 of the gif from giphy and obtained this gif below as a result, which looks pretty good in my opinion!
mkdir frames
ffmpeg -i giphy.mp4 -vf scale=320:-1:flags=lanczos,fps=10 frames/ffout%03d.png
convert -loop 0 frames/ffout*.png output.gif
Related videos on Youtube
![lash](https://i.stack.imgur.com/49Fx1.jpg?s=256&g=1)
lash
Updated on September 18, 2022Comments
-
lash almost 2 years
I was surprised today to find apparently how difficult it is to go from a
webp
animation togif
animation. MyGIMP 2.8.22
andImageMagick 7.0.7-21
onlinux 4.14.13-1-ARCH
don't seem to support the format, and the only tool available in repos seem to belibwebp 0.4.1
which includes a decode tool that lets you extract individual frames to some image formats, none of them being gif (It's a licensing problem maybe?)Anyway, I used the following 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
Which creates a gif animation from the extracted frames of the file supplied in the first argument.
I tried it on this file and the resulting file was kind of artifacty. Is it proper form to post in this forum for suggestions of improvement of the procedure/invocations?
And: If there are custom tools for this conversion, please share your knowledge! :)
-
Seamus about 4 yearsI have the same problem as the OP - I need to convert animated webp-to-gif. I would like to use
ffmpeg
& was drawn to your answer. But I must be missing something. You appear to be converting from mp4-to-gif. If you could enlighten me, I'd appreciate it. -
MRousse about 4 yearsI indeed converted mp4-to-gif (as it is possible to download mp4 from giphy). For webp-to-gif, you need to extract frames first (you can use the method described in this answer) using
anim_dump
then useffmpeg
to convert it back to a mp4 video (eg. usingffmpeg -framerate 25 -i dump_%04d.tiff output.mp4
) -
Sisir almost 4 years
-
Fred about 3 yearsthis did the trick nicely
-
NiMa Thr over 2 yearsgreat answer, though color-wise it reduces quality. Here's a script to convert webp with high quality gist.github.com/nimatrueway/0e743d92056e2c5f995e25b848a1bdcd
-
JavaRunner over 2 years@NiMaThr, thanks man!