#!/bin/bash # Build instructions: # https://medium.com/@eplt/5-minutes-to-install-imagemagick-with-heic-support-on-ubuntu-18-04-digitalocean-fe2d09dcef1 # Command: # https://zwbetz.com/convert-heic-images-to-jpg/ # # Other useful mogrify commands: # -rotate 10 *.jpg # Rotates 10° clockwise # -extent "1900x3100" -gravity center *.jpg # Crops to 1900x3100 based on the center of the image # -resize "750x1550" # Shrinks (or grows) the image to the requested size red="$(tput setaf 1)" rst="$(tput sgr0)" # trap ctrl-c and call ctrl_c() # https://rimuhosting.com/knowledgebase/linux/misc/trapping-ctrl-c-in-bash trap ctrl_c INT function ctrl_c() { if [ $filecount -eq 0 ]; then printf "%s\n" "${rst}${red}exiting${rst}" else printf "\n%s\n%s\n\n" "${rst}${red}CTRL+C detected - this may have corrupted the most recent attempted file" "conversion. Please inspect the latest file and delete or retry as needed.${rst}" fi exit } padding=" " if [[ "${@}" == *"-h"* ]]; then printf "%s\n" "Command:" printf "$padding%s\n" "Converts heic files (Apple's native picture format) to either jpg (default)" printf "$padding%s\n" "or png (larger file size) for easier manipulation or sharing. Requires that" printf "$padding%s\n" "Imagemagick's mogrify tool be complied and installed with heic support. See" printf "$padding%s\n" "step 1 at https://dismy.link/heicmogrify for a brief install guide." printf "%s\n" "Command usage:" printf "$padding%-20s%s\n" "--dir [directory]" "Specify a directory other than current" printf "$padding%-20s%s\n" "-d --delete" "Delete original files (default keeps originals)" printf "$padding%-20s%s\n" "-q --quiet" "Suppresses progress output (summaries are still displayed)" printf "$padding%-20s%s\n" "[--png|--jpg]" "Save as jpg/png (default is jpg)" printf "$padding%-20s%s\n" "-h --help" "Print this help message and exit" exit 0 fi # DEFAULTS # The folder with the files you want to convert directory="`pwd`" # Set to 0 to delete the original .heic files after they are converted keeporiginals=1 # Set to 0 for PNG (much larger file size) saveasjpg=1 # Suppress progress output keepquiet=0 filecount=0 customdir=0 instant=0 for _arg in ${@}; do if [ $customdir -eq 1 ]; then directory="$_arg"; customdir=2; continue; fi if [ "$_arg" == "--dir" ]; then customdir=1; continue; fi if [ "$_arg" == "-d" ]; then keeporiginals=0; continue; fi if [ "$_arg" == "--delete" ]; then keeporiginals=0; continue; fi if [ "$_arg" == "-q" ]; then keepquiet=1; continue; fi if [ "$_arg" == "--quiet" ]; then keepquiet=1; continue; fi if [ "$_arg" == "--png" ]; then saveasjpg=0; continue; fi if [ "$_arg" == "--jpg" ]; then saveasjpg=1; continue; fi if [ "$_arg" == "-now" ]; then instant=1; continue; fi if [ "$_arg" == "--now" ]; then instant=1; continue; fi done # Make sure the mogrify command is available. If this is being # run as a cron job the which command will fail so we check the # default location just in case. mymogrify=`which mogrify` which mogrify > /dev/null if [[ $? -eq 1 ]]; then if [[ -e "/usr/local/bin/mogrify" ]]; then mymogrify="/usr/local/bin/mogrify" else printf "%s\n" "Unable to locate the mogrify command. Please follow the build and" printf "%s\n" "installation guide at https://dismy.link/heicmogrify to install" printf "%s\n" "the ImageMagick mogfify tool on your system with heic support." exit 1 fi fi # summary: printf "\n%s\n" "Summary:" printf "$padding%s\n" "Binary: $mymogrify" printf "$padding%s\n" "Directory: $directory" [ $keeporiginals -eq 0 ] && printf "$padding%s\n" "Originals: Delete" || printf "$padding%s\n" "Originals: Keep" [ $keepquiet -eq 0 ] && printf "$padding%s\n" "Output: Visible" || printf "$padding%s\n" "Output: Hidden" [ $saveasjpg -eq 0 ] && printf "$padding%s\n" "Save as: PNG" || printf "$padding%s\n" "Save as: JPG" if [ $instant -eq 0 ]; then printf "\n%s" "Press enter to begin or ^c to exit" read fi [ $saveasjpg -eq 0 ] && destformat="png" || destformat="jpg" # Loop over all the .heic files in the folder for heic in *.heic; do # Drop the .heic extension and append .jpg instead img=`echo "$heic" | rev | cut -d. -f2- | rev`.$destformat if [ -f "$img" ]; then [ $keepquiet -eq 0 ] && printf "%s\n" "Skipping $heic ($img exists)" else [ $keepquiet -eq 0 ] && printf "%s\n" "Converting $heic to $img"; fi [ -f "$img" ] || let filecount=filecount+1 # If the file we are going to make does not exist, run the command to convert it if [ ! -f "$img" ]; then $mymogrify -format $destformat "$heic" mogrified=$? if [ $mogrified -ne 0 ]; then printf "\n%s\n\n" "${rst}${red}Encountered the above error while trying to mogrify. Exiting.${rst}" exit $mogrified fi fi # If we don't want the originals, give them the axe [ $keeporiginals -eq 0 ] && rm "$heic" done if [ $filecount -gt 0 ]; then if [ $filecount -eq 1 ]; then printf "\n%s\n\n" "Script complete. Converted $filecount heic file to $destformat" else printf "\n%s\n\n" "Script complete. Converted $filecount heic files to $destformat" fi else if [ $customdir -eq 2 ]; then printf "\n%s\n\n" "Found 0 heic files to convert. Are you sure you specified the right directory?" else printf "\n%s\n\n" "Found 0 heic files to convert. Are you sure you're in the right directory?" fi fi