diff --git a/bin/imgoptim b/bin/imgoptim new file mode 100755 index 00000000..dcca7aa1 --- /dev/null +++ b/bin/imgoptim @@ -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 <&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