Skip to content

Instantly share code, notes, and snippets.

@leosunmo
Forked from alisdair/intensify.sh
Last active January 9, 2023 09:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save leosunmo/a7e868a735d2bf9ada31f2c97b9139d5 to your computer and use it in GitHub Desktop.
Save leosunmo/a7e868a735d2bf9ada31f2c97b9139d5 to your computer and use it in GitHub Desktop.
intensifies Slack emoji creator
#!/bin/bash
# Generate a `:something-intensifies:` Slack emoji, given a reasonable image
# input. I recommend grabbing an emoji from https://emojipedia.org/
set -euo pipefail
if ! command -v identify &> /dev/null
then
if [ "$(uname)" == "Darwin" ]; then
echo "ImageMagick could not be found, install it with \"brew install ImageMagick\""
exit
else
echo "ImageMagick could not be found, install it with \"apt install imagemagick -y\""
exit
fi
fi
# Number of frames of shaking
count=10
# Max pixels to move while shaking
delta=4
if [ $# -eq 0 ]; then
echo "Usage: $0 input.png"
exit 1
fi
input=$1
cd "$(dirname "$input")"
filename=$(basename -- "$input")
# Add 10% padding to width and height, then scale to 128x128
width=$(identify -format "%w" "$filename")
height=$(identify -format "%h" "$filename")
new_width=$(( width + width / 10 ))
new_height=$(( height + height / 10 ))
extended="${filename%.*}-extended.png"
convert \
-gravity center \
-background none \
-extent ${new_width}x${new_height} \
-geometry 128x128 \
"$filename" \
"$extended"
# Generate some shaky frames
frame="${filename%.*}-frame"
n=0
while [ "$n" -lt "$count" ]; do
# Generate some random shake
x=$((RANDOM % (delta * 2) - delta))
y=$((RANDOM % (delta * 2) - delta))
# Ensure coordinates are of the form +3 or -4
[ "$x" -ge 0 ] && x="+$x"
[ "$y" -ge 0 ] && y="+$y"
# Shake the image!
convert "$extended" -page "${x}${y}" -background none -flatten "$frame"-"$n".gif
n=$((n + 1))
done
# Combine the frames into a GIF
gif="${filename%.*}-intensifies.gif"
convert -background none -dispose Background -delay 1x30 -loop 0 "${frame}"-*.gif "$gif"
# Clean up
rm "$extended" "${frame}"-*.gif
# Optimise if file is too big
if [[ $(stat --format=%s "$gif") -ge 128000 ]]; then
convert "$gif" -fuzz 80% -layers Optimize "$gif"
fi
# We did it y'all
echo "Created $gif. Enjoy!"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment