Files
convertimage/convertimage.sh
2024-01-09 18:32:47 +01:00

388 lines
9.6 KiB
Bash
Executable File

#!/usr/bin/env bash
italic="\033[3m"
#underline="\033[4m"
bgd="\033[1;4;31m"
red="\033[1;31m"
greenbold="\033[1;32m"
green="\033[0;32m"
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
showHelp
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 "<Press Enter to quit>"
read -pr ""
}
showHelp() {
clear
echo -e "${greenbold}Convertimage${reset} v0.5"
echo -e "Bruno <bruno<clicclac.info>"
echo -e "Convert image file to avif, webp or mozjpeg format."
echo
echo -e "${yellow}USAGE:${reset}"
echo -e "${green}convertimage [-Options...] -f <file>${reset}"
echo -e "\n${bold}Main Menu:${reset}"
echo -e "${yellow}OPTIONS:${reset}"
echo -e " ${green}-f${reset}, ${green}--file <file>${reset} Image file"
echo -e " ${green}-l${reset}, ${green}--lens${reset} Add lens exif"
echo
echo -e "${yellow}REQUIEREMENTS:${reset}"
echo -e " -${underline}exiftool${reset} for extract exifs ${bold}(requis)${reset}"
echo -e " brew install exiftool"
echo
echo -e "${yellow}EXAMPLES:${reset}"
echo -e " keyword2insta -f image.jpg"
echo
echo -e "${yellow}EXIT CODES:${reset}"
echo -e " 0: Success !"
echo -e "\n<Press Enter to quit>"
read -p ""
}
_mozjpeg() {
clear
echo "mozjpeg"
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
read -p "Press <Enter> to quit"
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 "${folder}"/**/*.{jpg,jpeg,png,tif,tiff}
do
echo "$FILE"
done
else
echo $bin
for FILE in "${folder}"/**/*.{jpg,jpeg,png,tif,tiff}
do
echo "$FILE"
done
fi
echo
read -p "Press <Enter> to quit"
}
_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${green}${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${greenbold}$count images were successfully converted !${reset}"
echo
read -p "Press <Enter> to quit"
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<Press Enter to quit>"
read -p ""
open "$dest_folder"
}
optspec="amwh"
while getopts "$optspec" opt
do
case $opt in
a) _avif;;
m) _mozjpeg; exit 0;;
w) _webp;;
h) showHelp;;
esac
done
main