#!/usr/bin/env bash # compressJPG.sh: compress a JPG with mozjpeg if the savings are worthwhile. # Author: Gwern Branwen # Date: 2020-02-07 # When: Time-stamp: "2026-02-05 22:48:02 gwern" # License: CC-0 set -e ## Inlining for portability # shellcheck source=./bash.sh # . ~/wiki/static/build/bash.sh # for 'get_image_files', 'green', 'red' red () { echo -e "\e[41m$@\e[0m"; } green () { echo -e "\e[32m$@\e[0m"; } get_image_files () { mapfile -t "$1" < <(find . -maxdepth 1 -type f \ \( -iname "*.jpg" -o -iname "*.jpeg" \) \ | sort --version-sort) } args=("$@") if [ ${#args[@]} -eq 0 ]; then get_image_files args green "Attempting to use implied arguments: ${args[@]}" fi if [ ${#args[@]} -eq 0 ]; then red "Error: no arguments available!"; exit 1 else command -v jpegtran > /dev/null command -v mogrify > /dev/null for FILE in "${args[@]}"; do JPG_OLD="$(mktemp /tmp/XXXXXX-original.jpg)" TMP_NEW="$(mktemp /tmp/XXXXXX-temp.jpg)" cp "$FILE" "$JPG_OLD" jpegtran -copy none -progressive -optimize -outfile "$TMP_NEW" "$JPG_OLD" mogrify -quality 60 "$TMP_NEW" ORIGINAL=$(wc -c < "$JPG_OLD") # NOTE: '-c' instead of '--bytes' for portability SMALL=$(wc -c < "$TMP_NEW") RATIO=$(echo "$ORIGINAL / $SMALL" | bc --mathlib) echo "$FILE : from $ORIGINAL to $SMALL ($RATIO)" if (( $(echo "$RATIO > 1.2" | bc --mathlib) )); then mv "$TMP_NEW" "$FILE" else green "(Not updating $FILE because savings insufficient.)" fi rm --force "$JPG_OLD" "$TMP_NEW" done fi