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
팩그리고 등등webpmux
dwebp
#!/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