今日、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
これは、最初の引数で指定されたファイルの抽出されたフレームからgifアニメーションを作成します。
this file で試してみたところ、- resulting file はちょっとしたアーティファクトでした。手順/呼び出しの改善の提案のためにこのフォーラムに投稿するのは適切なフォームですか?
そして:この変換のためのカスタムツールがある場合は、あなたの知識を共有してください! :)
このタスクにはffmpeg
を使用しました。良い結果が得られるはずの this thread をご覧ください。
私は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
スクリプトは問題なく機能しますが、個々のフレーム名をゼロで埋める必要があります。それ以外の場合は、フレームが乱れた順序でgifが作成されます。私はそれを修正し、いくつかのgiphy webpアニメーション(例を含む)で試してみましたが、出力は期待通りです。
以下は、2つの変更を加えたスクリプトです。最初に、変更されたfor
ループにより、これらのフレームファイル名にゼロが埋め込まれます。次に、別のwebpinfoチェックを追加してフレーム期間を取得し、それを(> 0の場合)DELAYに使用します(基本的に、人々が可変フレーム期間を使用していないと想定しています)。
#!/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