#!/bin/bash # png2all # last edited Sunday, 07/24/2022 # script by Paul Sherman # c2018-2022, GPL3 ################################################################################ # Help # ################################################################################ Help() { echo "" echo "Converts a PNG file:" echo "Formats include:" echo "" echo "JPG, WEBP, AVIF and JXL" echo "" echo "If you are starting with a transparent PNG," echo "rename the file to end with" echo "_T.png" echo "prior to conversions." echo "" echo } while getopts ":h" option; do case $option in h) # display Help Help exit;; esac done if [[ "$DISPLAY" && "$(which Xdialog 2>&1 | grep -v "which: no")" ]]; then dialog="Xdialog" else dialog="dialog" fi if [ ! -e "$1" ]; then $dialog --title "No File Specified" --msgbox "\nMust be passed a PNG file\n" 10 36 exit fi ISPNG=`gm identify "$1" | cut -d " " -f 2` if [ ! "$ISPNG" = "PNG" ]; then $dialog --title "Not a PNG" --msgbox "\nThe file does not appear\nto be a valid PNG.\n" 10 36 exit fi pth=`dirname "$1"` cd $pth echo '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 uf3PHv8DFMHdkAeXazMAAAAASUVORK5CYII= ' | base64 -d > /tmp/icon.png tmpfile=/tmp/1.png cp -f "$1" "$tmpfile" 2> /dev/null # to get rid of png color profile errors gm mogrify -strip "$tmpfile" 2>/dev/null bname=$(basename "$1") isOpaque=`gm identify -format '%[opaque]' $tmpfile` # first, if NOT transparent if [ isOpaque == true ]; then if [[ "$bname" =~ "_T.png" ]]; then noAlpha=`echo "$bname" | sed 's/\_T.png/\.png/'` toAlpha="$(echo "$noAlpha" | sed 's/ /_/g')" newname="$pth/$noAlpha" else newname="$(echo "$bname" | sed 's/ /_/g')" newname="$pth/$newname" fi # if transparent else if [[ "$bname" =~ "_T.png" ]]; then newname="$(echo "$bname" | sed 's/ /_/g')" newname="$pth/$newname" else toAlpha=`echo "$bname" | sed 's/\.png/\_T.png/'` toAlpha="$(echo "$toAlpha" | sed 's/ /_/g')" newname="$pth/$toAlpha" fi fi function CLOSE_EXIT() { echo "Close and exit..." # stop any of the conversions... killall -9 cwebp 2>/dev/null killall -9 avifenc 2>/dev/null killall -9 gm 2>/dev/null killall -9 cjxl 2>/dev/null # dump the dialog kill $(ps aux | grep 'yad' | awk '{print $2}') 2>/dev/null pkill -f $0 } ; export -f CLOSE_EXIT start_process () { if [[ ! "$newname" =~ "_T.png" ]]; then jname=`echo "$newname" | sed 's/\.png/\.jpg/'` wname=`echo "$newname" | sed 's/\.png/\.webp/'` avname=`echo "$newname" | sed 's/\.png/\.avif/'` xlname=`echo "$newname" | sed 's/\.png/\.jxl/'` cwebp -q 90 "$tmpfile" -o "$wname" avifenc --min 30 --max 30 "$tmpfile" "$avname" cjxl "$tmpfile" "$xlname" -q 85 gm convert -background white -extent 0x0 +matte -flatten -quality 85 "$newname" "$jname" echo "Done." rm -f /tmp/icon.png 2>/dev/null exit 0 fi # leaves script already if we did not start with a transparent PNG ################################################################################################## flatpng=`echo "$newname" | sed 's/\_T.png/\.png/'` jname=`echo "$flatpng" | sed 's/\.png/\.jpg/'` wname=`echo "$flatpng" | sed 's/\.png/\.webp/'` avname=`echo "$flatpng" | sed 's/\.png/\.avif/'` xlname=`echo "$flatpng" | sed 's/\.png/\.jxl/'` gm convert -background white -extent 0x0 +matte "$tmpfile" "$flatpng" gm convert -quality 85 "$flatpng" "$jname" cwebp -q 90 "$tmpfile" -o "$wname" avifenc --min 30 --max 30 "$tmpfile" "$avname" cjxl "$tmpfile" "$xlname" -q 85 rm -f /tmp/icon.png 2>/dev/null rm -f $tmpfile echo "Done." } # swing yad dialog to top-right of screen XX=`xdpyinfo | grep dimensions | awk '{print $2}' | awk -Fx '{print $1}'` XXX=$(( ${XX}-414 )) # Show the conversion dialog yad --info --posx=$XXX --width=400 --title="Converting" --on-top --window-icon="/tmp/icon.png" --text-align center --button="EXIT:bash -c CLOSE_EXIT" --text="\n\nNow converting to\n\nwebp, jpeg, \navif and jxl \n\nThis dialog will close when complete...\n(clicking EXIT will stop conversions)\n\n\n\nIf you start with a transparent PNG,\nthen rename it to end with\n_T.png\nprior to conversions." & # Do the conversions start_process sleep 2 kill $(ps aux | grep 'yad' | awk '{print $2}') 2>/dev/null