webpアニメーションをgifアニメーション(cli)

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を生成します。

試してみたこのファイルそして結果ファイル少し人工的です。このフォーラムに手順/通貨を改善するための提案を投稿するのは適切ですか?

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

答え1

私自身も同じ問題に遭遇し、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)

Python3.8とPillow 8.0.1を使用してテストされました。たとえば、次のようにライブラリをインストールまたはアップグレードする必要があります。python3 -m pip install --user --upgrade Pillow

*.webp現在のフォルダ内のすべてのファイルを*.gif1行ずつ同じ名前のファイルに一括変換します。

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

注:この回答は以下からインスピレーションを受けました。スタックオーバーフロー

答え2

スクリプトはうまく機能しますが、個々のフレーム名をゼロで埋める必要があります。それ以外の場合、フレームが間違ったgifが生成されます。私はこの問題を解決し、いくつかのgiphy webpアニメーション(あなたの例を含む)で試してみましたが、出力は正確に期待していたようです。

以下は、2つの変更を含むスクリプトです。まずfor、ループを変更してこれらのフレームファイル名をゼロで埋めます。次に、フレームの持続時間を取得し、遅延が> 0の場合、それを使用するために別のwebpinfoチェックを追加しました(素早く人々が可変フレームの持続時間を使用しないと仮定)。

#!/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

これを完了するために使用します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

ここに画像の説明を入力してください。

答え4

ほとんどのスクリプトは、次にanim_dump含まれるバイナリを使用して置き換えることができます。libwebpパックそしてwebpmuxdwebp

#!/bin/bash

for file in /path/to/*.webp; do
    mkdir "$temporaryDirectory.frames"

    # export a webp file into frames;
    # Download the packge directly from the official Google Analytics repository in
    # http://storage.googleapis.com/downloads.webmproject.org/releases/webp/libwebp-1.3.0-linux-x86-64.tar.gz
    anim_dump -folder "$temporaryDirectory.frames" "$file"

    convert "$temporaryDirectory.frames"/*.png -delay 10 -loop 0 "$file.gif"
    /bin/rm -fr "$temporaryDirectory.frames"
done

関連情報