las*_*ash 16 arch-linux imagemagick gif animation webp
今天我很惊讶地发现从webp动画到gif动画显然是多么困难。我GIMP 2.8.22和ImageMagick 7.0.7-21上linux 4.14.13-1-ARCH似乎并不支持该格式,唯一的工具,回购可似乎是libwebp 0.4.1其中包括一个解码工具,可以让您提取单个帧的一些图像格式,他们都不是GIF的(这是一个授权问题可能? )
无论如何,我使用了以下脚本:
#!/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
Run Code Online (Sandbox Code Playgroud)
它从第一个参数中提供的文件的提取帧中创建一个 gif 动画。
我试图在这个文件和生成的文件是那种artifacty的。在此论坛上张贴改进程序/调用的建议是否合适?
并且:如果有用于此转换的自定义工具,请分享您的知识!:)
你的脚本工作得很好,但你需要零填充你的个人框架名称;否则,它会以混乱的顺序创建带有框架的 gif。我修复了这个问题并在一些 giphy webp 动画(包括你的例子)上尝试了它,输出是你所期望的。
以下只是您的脚本,有两个更改。首先,一个改变的for循环来零填充这些帧文件名。其次,我添加了另一个 webpinfo 检查来获取帧持续时间并将其(如果 > 0)用于延迟(天真地假设人们没有使用可变帧持续时间):
#!/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
Run Code Online (Sandbox Code Playgroud)
小智 7
我会用ffmpeg这个任务。看看这个线程,它应该会给你很好的结果。
我尝试使用来自 giphy 的 gif 的 mp4,结果得到了下面的这个 gif,在我看来它看起来很不错!
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
Run Code Online (Sandbox Code Playgroud)
我自己也遇到了同样的问题,我发现使用 Python 及其 Pillow 库可能是最简单的方法。只需导入它,让它加载图像文件,然后使用适当的选项直接再次保存。
from PIL import Image
im = Image.open('your_file.webp')
im.save('your_file.gif', 'gif', save_all=True, optimize=True, background=0)
Run Code Online (Sandbox Code Playgroud)
使用 Python3.8 和 Pillow 8.0.1 测试。您可能必须先安装或升级库,例如使用python3 -m pip install --user --upgrade Pillow
全部在一行上将*.webp当前文件夹中的所有文件批量转换为*.gif具有相同名称的文件:
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
Run Code Online (Sandbox Code Playgroud)
注意:这个答案的灵感来自Stack Overflow。