webp 动画到 gif 动画 (cli)

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的。在此论坛上张贴改进程序/调用的建议是否合适?

并且:如果有用于此转换的自定义工具,请分享您的知识!:)

Sea*_*han 8

你的脚本工作得很好,但你需要零填充你的个人框架名称;否则,它会以混乱的顺序创建带有框架的 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)

在此处输入图片说明

  • [ffmpeg 不支持解码动画 webp](https://trac.ffmpeg.org/ticket/3760) (5认同)
  • 我和 OP 有同样的问题 - 我需要转换 *animated* **webp-to-gif**。我想使用`ffmpeg`并被你的答案所吸引。但我一定错过了一些东西。您*似乎*正在从 **mp4 转换为 gif**。如果你能启发我,我将不胜感激。 (4认同)

Byt*_*der 7

我自己也遇到了同样的问题,我发现使用 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。