Using the service from https://tinypng.com makes it easy to mass-shrink your PNG images to more palatable sizes, and it comes with a neat 500 free use transcodes per month, and it’s quite cheap after that.
Here’s a little script to help you with the work a bit.
Prerequisites:
bash, jq and curl.
Save the file as “tinify” and do a chmod 755 tinify
Flags:
-k <key> = API key for tinypng.com – can be omitted if specified in the environment variable by export TINIFY_API ="<api_key>"
-f <file> = Filename to compress
-r = Replace the original file with the compressed file. If not specified, the output file will be named tiny-<filename>
-v = verbose output
-s = Show compression statistics (1 line per file)
#!/bin/env bash # (C) EmberLabs / Chris Sprucefield 2023. # License: CC BY. key='' file='' r_flag=false v_flag=false s_flag=false s_arg="-s" if [ "${TINIFY_API}" != "" ] then if [ "${v_flag}" == true ] ; then echo "Using API key from env." ; fi key="${TINIFY_API}" fi while getopts 'rk:f:vsh?' flag; do case "${flag}" in r) r_flag=true ;; k) key="${OPTARG}" ;; f) file="${OPTARG}" ;; v) v_flag=true s_arg="" ;; s) s_flag=true ;; *) echo "<cmd> -? | -h This help text" echo " -r Replace the original file with tinified file." echo " -k <apikey> The API key for tinify (or from \$TINIFY_API environment variable if set)" echo " -f <filename> The filename to encode (and replace if -r is specified)" echo " -v Verbose output" echo " -s Show compression statistics" exit 1 ;; esac done if [ "${v_flag}" == true ] ; then echo "Processing ${file}" ; fi JSON="$(curl ${s_arg} --user "api:${key}" --data-binary "@${file}" -i https://api.tinify.com/shrink | tail -1)" URL="$(echo "${JSON}" | jq '.output.url' | sed 's/\"//g')" ISIZE="$(echo "${JSON}" | jq '.input.size')" OSIZE="$(echo "${JSON}" | jq '.output.size')" RATIO="$(echo "${JSON}" | jq '.output.ratio')" W="$(echo "${JSON}" | jq '.output.width')" H="$(echo "${JSON}" | jq '.output.height')" if [ "${ISIZE}" == "${OSIZE}" ] then if [ "${v_flag}" == true ] ; then echo "No compression on ${file} - skipped." ; fi exit 0 fi if [ "${URL}" != "null" ] then if [ "${v_flag}" == true ] ; then echo "Fetching ${URL}" ; fi curl ${s_arg} "${URL}" -o "tiny-${file}" if [ "${r_flag}" == true ] then if [ "${v_flag}" == true ] ; then echo "Replacing original file" ; fi mv -f "tiny-${file}" "${file}" fi if [ "${s_flag}" == true ] then printf "%-40s %5d x %-5d In: %8d Out: %8d Ratio: %2.5f\n" "${file}" "${W}" "${H}" "${ISIZE}" "${OSIZE}" "${RATIO}" fi else echo "Invalid response. (incorrect API key?)" exit 1 fi