Add bin/imgoptim

This commit is contained in:
Henrik Lissner 2017-06-30 12:06:14 +02:00
parent 4270759614
commit ea54eb7d0b
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

69
bin/imgoptim Executable file
View file

@ -0,0 +1,69 @@
#!/usr/bin/env bash
# A simple script that losslessly optimizes image files given to it.
#
# Examples:
# imgoptim image.jpg image.png image.gif
# imgoptim directory_of_images/
# imgoptim directory_of_images/*.png
#
# Requires:
# PNGs: optipng, pngquant (lossy)
# JPGs: jpegtran, jpegoptim (lossy)
# GIFs: gifsicle
set -e
LOSSY=
usage() {
cat <<EOL
Usage: ${0##*/} [-lh] IMAGE [IMAGE2 [IMAGE3 [...]]]
-l enable lossy compression
-h this help
EOL
}
while getopts hl opt; do
case $opt in
h) usage; exit;;
l) LOSSY=1;;
:) >&2 echo "$OPTARG requires an argument"; usage; exit 1;;
*) >&2 echo "Not a valid arg: $opt"; usage; exit 1;;
esac
done
shift $((OPTIND-1))
_filesize() {
case $OSTYPE in
darwin*) stat -c%s "$1" ;;
*) stat --printf="%s" "$1" ;;
esac
}
for file in $@; do
if [[ -d $file ]]; then
imgoptim $file/*
elif [[ -f $file ]]; then
pre_size=$(_filesize "$file")
case ${file##*.} in
png)
[[ $LOSSY ]] && pngquant $file
optipng -nc -nb -o7 $file
;;
gif)
gifsicle --batch --optimize=3 "$file"
;;
jpg|jpeg)
[[ $LOSSY ]] && jpegoptim --max=90 "$file"
jpegtran -copy none -optimize -progressive -outfile "$file" "$file"
;;
*) printf "Unrecognized file '$file': ignored"
;;
esac
post_size=$(_filesize "$file")
perc=$(echo "((${pre_size} - ${post_size}) / ${pre_size}) * 100" | bc -l)
printf "* %s: %d => %d (%.2f%% reduction)\n" "$file" "${pre_size}" "${post_size}" "$perc"
fi
done