web-dev-qa-db-ja.com

webpアニメーションからgifアニメーション(CLI)

今日、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 はちょっとしたアーティファクトでした。手順/呼び出しの改善の提案のためにこのフォーラムに投稿するのは適切なフォームですか?

そして:この変換のためのカスタムツールがある場合は、あなたの知識を共有してください! :)

7
lash

このタスクには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

enter image description here

3
MRousse

スクリプトは問題なく機能しますが、個々のフレーム名をゼロで埋める必要があります。それ以外の場合は、フレームが乱れた順序で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
3
Sean Mahan