#!/usr/bin/env bash italic="\033[3m" #underline="\033[4m" bgd="\033[1;4;31m" red="\033[1;31m" bold="\033[1m" bold_under="\033[1;4m" reset="\033[0m" shopt -s globstar shopt -s nullglob ### Preferences ### ## Destination folder ## dest_folder=$HOME/Desktop/convertimage # Input folder folder=/Users/bruno/Desktop/Photo-du-mois ## mozjepg ## # /opt/homebrew/opt/jpeg-turbo/bin/cjpeg (89872ko) libjpeg-turbo version 2.1.3 (build 20220225) # https://www.libjpeg-turbo.org/ https://github.com/libjpeg-turbo/libjpeg-turbo https://sourceforge.net/projects/libjpeg-turbo/files/2.1.3/ # mozjpeg => /usr/local/bin/mozcjpeg -> /opt/homebrew/opt/mozjpeg/bin/cjpeg (108608) mozjpeg version 4.0.3 (build 20210225) # https://github.com/mozilla/mozjpeg # cjpeg => /opt/homebrew/bin/cjpeg -> ../Cellar/jpeg/9e/bin/cjpeg (72112) jpeg9e # https://www.ijg.org/ mozjpeg_lossless=false moz_quality=75 ## sips ## sips_quality=50 ## webp ## webp_lossless=false webp_quality=75 ## avif ## avif_lossless=false #clear # Destination folder if [ ! -d "$dest_folder" ]; then echo -e "Creating destination folder..." mkdir "$dest_folder" fi # Input folder if [[ $folder == "" ]]; then while true do read -e -pr "Images folder: " -i "$HOME" folder if [ -d "$folder" ]; then break else echo -e "The folder $folder doesn't exist !" fi done fi : <<'END_COMMENT' END_COMMENT # Main Menu main() { clear while : do clear echo -e "" echo -e "${bold} 🔈 Convertimage${reset}" echo -e "" echo -e "Source folder: ${bold}$folder${reset}" echo -e "Destination folder: ${bold}$dest_folder${reset}" echo -e "" echo -e "---------------------------------" echo -e " Main Menu " echo -e "---------------------------------" echo -e " 1) ${bgd}A${reset}bout " echo -e " 2) ${bgd}H${reset}elp " echo -e " 3) ${bgd}m${reset}ozjpeg " echo -e " 4) a${bgd}v${reset}if " echo -e " 5) ${bgd}w${reset}ebp " echo -e " 6) hei${bgd}c${reset} " echo -e " 7) ${bgd}Q${reset}uit " echo -e "=================================" echo -e "Enter your menu choice [1-7]: \c " read -er main_menu if [[ $main_menu == "1" ]] || [[ $main_menu == "a" ]] || [[ $main_menu == "A" ]]; then about elif [[ $main_menu == "2" ]] || [[ $main_menu == "h" ]] || [[ $main_menu == "H" ]]; then help elif [[ $main_menu == "3" ]] || [[ $main_menu == "m" ]] || [[ $main_menu == "M" ]]; then _mozjpeg elif [[ $main_menu == "4" ]] || [[ $main_menu == "v" ]] || [[ $main_menu == "V" ]]; then _avif elif [[ $main_menu == "5" ]] || [[ $main_menu == "w" ]] || [[ $main_menu == "W" ]]; then _webp elif [[ $main_menu == "6" ]] || [[ $main_menu == "c" ]] || [[ $main_menu == "C" ]]; then _heic elif [[ $main_menu == "7" ]] || [[ $main_menu == "q" ]] || [[ $main_menu == "Q" ]]; then exit 0 else echo -e "\n${red}Oops!!! Please Select Correct Choice${reset}"; echo -e "Press ${bold}ENTER${reset} To Continue..." ; read -pr "" fi done } about() { clear echo "" echo -e "${bold}About convertimage:${reset}" echo "" echo "" echo "Convert image file to avif, webp or mozjpeg format." echo "" echo "" read -pr "" } help() { clear echo "" echo -e "${bold_under}Help:${reset}" echo -e "\n${bold}Main Menu:${reset}" echo -e "\n" read -pr "" } _mozjpeg() { clear if [ "$mozjpeg_lossless" = true ]; then bin=$(command -v jpegtran || command -v mozjpegtran) if [ "$bin" = "" ]; then echo -e "${bold}convertimage${reset} require ${bold}jpegtran${reset} from ${bold}mozjpeg${reset} but it's not installed.\nRun ${italic}(brew install mozjpeg)${reset}\nAborting..." >&2; exit 1; fi; echo -e "\n${bold}jpegtran converter${reset}\n" for FILE in "${folder}"/**/*.{jpg,jpeg} do filename=$(basename "$FILE") #extension=${filename##*.} filename=${filename%.*} echo -e "${italic}Convert $FILE${reset}🗑" mozjpegtran -outfile "$dest_folder/$filename.jpg" "$FILE" done else bin=$(command -v cjpeg || command -v mozcjpeg) if [ "$bin" = "" ]; then echo -e "${bold}convertimage${reset} require ${bold}cjpeg${reset} from ${bold}mozjpeg${reset} but it's not installed.\nRun ${italic}(brew install mozjpeg)${reset}\nAborting..." >&2; exit 1; fi; echo -e "\n${bold}cjpeg converter${reset}\n" for FILE in "${folder}"/**/*.{jpg,jpeg,png,bmp,tga} do filename=$(basename "$FILE") #extension=${filename##*.} filename=${filename%.*} echo -e "${italic}Convert $FILE${reset}" mozcjpeg -quality $moz_quality -outfile "$dest_folder/$filename.jpg" "$FILE" done fi # which mozjpegtran # /usr/local/bin/mozjpegtran # which mozcjpeg # /usr/local/bin/mozcjpeg echo -e "\n" read -pr "" open "$dest_folder" } _avif() { clear echo "avif" bin=$(command -v avifenc || command -v cavif || command -v magick || command -v heif-enc || command -v squoosh-cli) if [ "$bin" = "" ]; then echo -e "${bold}convertimage${reset} require ${bold}avifenc, cavif, magick, heif-enc or squoosh-cli${reset} but none is installed." echo -e " -for avifenc, run ${italic}brew install libavif${reset} (https://github.com/AOMediaCodec/libavif)" echo -e " -for cavif, run ${italic}go install cavif${reset} (https://github.com/kornelski/cavif-rs)" echo -e " -for magick, run ${italic}brew install imagemagick${reset} (https://imagemagick.org)" echo -e " -for heif-enc, run ${italic}${reset}" echo -e " -for squoosh-cli, run ${italic}npm i -g @squoosh/cli${reset}" echo -e "Aborting..." >&2; exit 1 fi if [ "$(command -v avifenc)" != "" ]; then bin=avifenc elif [ "$(command -v magick)" != "" ]; then bin=magick elif [ "$(command -v heif-enc)" != "" ]; then bin=heif-enc elif [ "$(command -v squoosh-cli)" != "" ]; then bin=squoosh-cli elif [ "$(command -v cavif)" != "" ]; then bin=cavif fi # avifenc -> brew install libavif # avifenc --min 0 --max 63 -a end-usage=q -a cq-level=18 -a tune=ssim --jobs 8 $img $avif_out (jpg|jpeg|png) (pas d'exif) # avifenc -l --jobs 8 $img $avif_out (lossless) # cavif -> go install cavif # cavif --quality $quality $img -o $avif_out (jpeg ou png) (pas d'exif) # libheif # heif-enc "$img" -A -L -p chroma=444 --matrix_coefficients=0 -o "$avif_out" (lossless) # heif-enc "$img" -A -q $quality -o "$avif_out" (jpg|jpeg|png) (pas d'exif) # magick -> brew install imagemagick # convert -define heic:speed=2 png/2022-04-16_Brocard_8990_8b.png magick/2022-04-16_Brocard_8990_8b_2.avif (jpg|jpeg|png|tif) (pas d'exif) # squoosh-cli -> npm i -g @squoosh/cli #squoosh-cli --output-dir 'squoosh-cli' --avif '{"cqLevel":33, "cqAlphaLevel":-1, "denoiseLevel":0, "tileColsLog2":0, "tileRowsLog2":0,"speed":6, "subsample":1, "chromaDeltaQ":false, "sharpness":0, "tune":0 }' png/*.png (jpg|jpeg|png) (pas d'exif) if [ "$avif_lossless" = true ]; then for FILE in "${SRC}"/**/*.{mkv,avi,mp4,m4v} do echo "$FILE" done else for FILE in "${SRC}"/**/*.{mkv,avi,mp4,m4v} do echo "$FILE" done fi echo -e "\n" read -pr "" } _webp() { clear count=0 bin=$(command -v cwebp || command -v mozcjpeg) if [ "$bin" = "" ]; then echo -e "${bold}convertimage${reset} require ${bold}cwebp${reset} but it's not installed.\nRun ${italic}(brew install webp)${reset}\nAborting..." >&2; exit 1; fi; vers=$(cwebp -version) echo -e "\n${bold}webp converter${reset}" echo -e "cwebp v$vers\n" for FILE in "${folder}"/**/*.{jpg,jpeg,png,tif,tiff} do filename=$(basename "$FILE") #extension=${filename##*.} filename=${filename%.*} echo -e "\n${italic}Convert $FILE${reset}\n" if [ "$webp_lossless" = true ]; then cwebp -lossless "$FILE" -mt -o "$dest_folder/$filename.webp" else cwebp -q $webp_quality -mt "$FILE" -o "$dest_folder/$filename.webp" fi ((count++)) done echo -e "\n$count images were successfully converted !" echo -e "\n" read -pr "" open "$dest_folder" } _heic() { clear count=0 bin=$(command -v sips) if [ "$bin" = "" ]; then echo -e "${bold}convertimage${reset} require ${bold}sips${reset} but it's not installed.\n${bold}sips${reset} is a part of macOS\nAborting..." >&2; exit 1; fi; echo -e "\n${bold}heic converter${reset}\n" for FILE in "${folder}"/**/*.{jpg,jpeg,tif,png,bmp,tga} do filename=$(basename "$FILE") #extension=${filename##*.} filename=${filename%.*} echo -e "${italic}Convert $FILE${reset}" sips -s format heic -s formatOptions $sips_quality "$FILE" --out "$dest_folder/$filename.heic" ((count++)) done echo -e "\n$count images were successfully converted !" echo -e "\n" read -pr "" open "$dest_folder" } main