Skip to content

Instantly share code, notes, and snippets.

@okurka12
Created May 6, 2025 08:38
Show Gist options
  • Save okurka12/ab0bb9a70a1486957c64b30b9b916a37 to your computer and use it in GitHub Desktop.
Save okurka12/ab0bb9a70a1486957c64b30b9b916a37 to your computer and use it in GitHub Desktop.
convert mp4 video to gif and optionally remove green background
#!/bin/bash
#
# convert mp4 video to gif and optionally remove green background
#
# created: early 2025
# ffmpeg version 5.1.6-0+deb12u1
# ImageMagick 6.9.11-60
if [ ! -f "$1" ]; then
echo "usage: $0 FILE"
echo "...where FILE is a mp4 FILE"
exit
fi
MP4FILE="$1"
OUTFILE="output.gif"
# extract frames at this framerate
FPS=10
# delay after a frame in GIF (example: 5 means 20 FPS)
GIF_DELAY=10
REMOVE_GREEN=y
# extract frames (-r 20 means 20 FPS)
ffmpeg -i "$MP4FILE" -vf "scale=1080:-1:flags=lanczos" -r $FPS intermediate_frames_%04d.png
TOTAL=$(ls -1 intermediate_frames_*.png | wc -l)
CNT=1
if [ "$REMOVE_GREEN" = "Y" ]; then
# remove green (adjust the -fuzz parameter if needed)
echo "removing green from pictures..."
for frame in intermediate_frames_*.png; do
echo "removing green $CNT/$TOTAL"
CNT=$(expr $CNT + 1)
convert "$frame" -alpha on -channel RGBA -evaluate Multiply 1 -fill none \
-fuzz 30% \
-opaque "#00F000" \
-opaque "#00F100" \
-opaque "#00F200" \
-opaque "#00F300" \
-opaque "#00F400" \
-opaque "#00F500" \
-opaque "#00F600" \
-opaque "#00F700" \
-opaque "#00F800" \
-opaque "#00F900" \
-opaque "#00FA00" \
-opaque "#00FB00" \
-opaque "#00FC00" \
-opaque "#00FE00" \
-opaque "#00FF00" \
"$frame"
done
fi # if REMOVE_GREEN = y
# put frames to gif
# -delay centiseconds display the next image after pausing
# convert -delay 10 -loop 0 intermediate_frames_*.png output.gif
echo "merging frames into a gif..."
convert \
-background none \
-alpha on \
-delay $GIF_DELAY \
-loop 0 \
-dispose Background \
intermediate_frames_*.png \
output.gif
# -layers OptimizeTransparency \
# -layers RemoveDups \
# -layers RemoveZero \
echo "saved in $OUTFILE"
du -h "$OUTFILE"
# remove frames
rm intermediate_frames_*.png
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment