Skip to content

Instantly share code, notes, and snippets.

@swinton
Created April 26, 2025 23:43
Show Gist options
  • Save swinton/d06e01fff923bb31de4460f9760675a8 to your computer and use it in GitHub Desktop.
Save swinton/d06e01fff923bb31de4460f9760675a8 to your computer and use it in GitHub Desktop.
#!/bin/bash
# Usage: ./glitchify.sh /path/to/your/input.jpg
# https://chatgpt.com/share/680d6d83-c9d8-8005-8c29-252270e9179b
# Check for input argument
if [ "$#" -ne 1 ]; then
echo "Usage: $0 /path/to/your/input.jpg"
exit 1
fi
INPUT_IMG="$1"
BASENAME=$(basename "$INPUT_IMG" .jpg)
WORKDIR="glitch_build_${BASENAME}"
# Make a clean working folder
mkdir -p "$WORKDIR"
cd "$WORKDIR"
# Step 1: Prepare the base image
cp "../$INPUT_IMG" base.jpg
# Step 2: Generate 40 glitch frames
for i in $(seq -w 0 39); do
BRIGHT=$((95 + RANDOM % 11))
BLUR=$(awk -v min=0.0 -v max=1.0 'BEGIN{srand(); print min+rand()*(max-min)}')
GLITCH_TYPE=$((RANDOM % 12))
if [ "$GLITCH_TYPE" -eq 0 ]; then
# FULL TV BREAKDOWN FRAME
magick base.jpg \
-evaluate GaussianNoise 25% \
-modulate 120,80,80 \
-blur 0x2 \
\( -size 1x3 pattern:gray25 -resize 100%x300% \) -gravity center -compose Multiply -composite \
frame_${i}.jpg
elif [ "$GLITCH_TYPE" -lt 3 ]; then
# HARD GLITCH FRAME (RGB split + Scanlines)
magick base.jpg \
\( +clone -channel R -roll +5+0 \) -compose Lighten -composite \
\( +clone -channel B -roll -5+0 \) -compose Lighten -composite \
-modulate $BRIGHT,100,100 \
-statistic NonPeak 1x1 \
-blur 0x$BLUR \
\( -size 1x3 pattern:gray50 -resize 100%x200% \) -gravity center -compose Multiply -composite \
frame_${i}.jpg
else
# NORMAL FLICKER FRAME
SHIFT=$((RANDOM % 5))
if [ "$SHIFT" -eq 0 ]; then
magick base.jpg \( +clone -channel R -roll +1+0 \) -compose Lighten -composite -modulate $BRIGHT,100,100 -statistic NonPeak 1x1 -blur 0x$BLUR frame_${i}.jpg
elif [ "$SHIFT" -eq 1 ]; then
magick base.jpg \( +clone -channel B -roll -1+0 \) -compose Lighten -composite -modulate $BRIGHT,100,100 -statistic NonPeak 1x1 -blur 0x$BLUR frame_${i}.jpg
else
magick base.jpg -modulate $BRIGHT,100,100 -statistic NonPeak 1x1 -blur 0x$BLUR frame_${i}.jpg
fi
fi
done
# Step 3: Assemble frames into a glitch video
ffmpeg -framerate 10 -pattern_type glob -i 'frame_*.jpg' -c:v libx264 -pix_fmt yuv420p -vf "scale=1000:1000" glitch_1000x1000.mp4
# Step 4: Overlay the glitch video onto Template.jpg
ffmpeg -i glitch_1000x1000.mp4 -loop 1 -i ../Template.jpg -filter_complex "[1:v][0:v]overlay=(W-w)/2:(H-h)/2:shortest=1" -c:v libx264 -pix_fmt yuv420p -y final_glitch_framed.mp4
# Step 5: Done!
echo "✅ Final video ready: $WORKDIR/final_glitch_framed.mp4"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment