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현재 폴더의 모든 파일을 *.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

참고: 이 답변은 다음에서 영감을 받았습니다.스택 오버플로.

답변2

스크립트는 잘 작동하지만 개별 프레임 이름을 0으로 채워야 합니다. 그렇지 않으면 프레임이 잘못된 gif가 생성됩니다. 나는 이 문제를 해결하고 일부 giphy webp 애니메이션(귀하의 예 포함)에서 시도해 보았으며 출력은 정확히 기대했던 것과 같습니다.

다음은 두 가지 변경 사항이 포함된 스크립트입니다. 먼저 for루프를 변경하여 이러한 프레임 파일 이름을 0으로 채우십시오. 둘째, 프레임 지속 시간을 가져오고 지연에 > 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

관련 정보