commit 68a07725c7fed801a0f40b88cf47512e03c81b95 Author: Bruno21 Date: Sat Aug 27 15:43:34 2022 +0200 First commit diff --git a/convertimage.sh b/convertimage.sh new file mode 100755 index 0000000..42623ea --- /dev/null +++ b/convertimage.sh @@ -0,0 +1,345 @@ +#!/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