sticoeureuse/preprocess_png_sticoeureuse.sh
2024-12-13 13:53:22 +01:00

142 lines
3.7 KiB
Bash
Executable file

#!/bin/bash
print_usage() {
printf "$License
Pour preprocess (resize, dither, potentiellement rotate) pour imprimer avec la stickerheureuse (TM)
Usage: \"./preprocess_png_sticoeureuse.sh -i input.jpg/png ...\"
-h help
-i fichier d'entrée.
Si les options \"-r\" ou \"-a\" sont utilisé, alors -i sera le dossier d'entrée.
Si rien n'est fournie alors le dossier d'entrée sera le dossier depuis lequel vous exécutez ce script.
-o nom du fichier de sortie (si rien n'est precisé, le fichier de sortie sera \"{input}_preprocessed.png\".
-s inverse le sens de l'image (par default le coté le moins long est la largeur du ruban)
-W fixer la largeur du ruban en pixel (default = 719 ~ 720 pour un ruban de 62mm)
-a faire l'operation pour tout les fichier image dans le dossier.
-r le faire pour tout les fichier image dans le dossier et recursivement dans tout les dossier en dessous.
-f [déconseilé] si ce flag est présent, le program reconvertira les fichier qui se finissent par \"_preprocessed\".
-N [déconseilé] n'utilise pas de courbe de calibration (utile pour la calibration. Courbe calibré sur une QL700)
"
}
curve="0/0 0.3/0.45 0.5/0.6 0.7/0.65 0.85/0.75 1/1"
input=
output=
all=false
recursive=false
include=false
turn=">"
width=719
while getopts 'i:o:sW:Narfh' flag; do
case "${flag}" in
h) print_usage;
exit 1;;
i) input="${OPTARG}";;
o) output="${OPTARG}";;
s) turn="<";;
a) all=true;;
r) all=true; recursive=true;;
f) include=true;;
W) width="${OPTARG}";;
N) curve="0/0 1/1";;
esac
done
if [ "${all}" = "true" ]; then
find_all() {
first=1
for ext in "$@"; do
if [[ $first == 1 ]]; then
find_filter=(-iname "*.$ext")
first=0
else
find_filter+=( -o -iname "*.$ext")
fi
done
additional_flag=""
if [ $recursive == false ] ; then
additional_flag+="-maxdepth 1"
fi
echo "$(find . ${additional_flag} -type f \( "${find_filter[@]}" \) | cut -b 3-)"
}
if [ ! -z "${input}" ]; then
cd ${input}
fi
all=$(find_all "jpg" "jpeg" "png" "pdf" "PNG" "JPG" "PDF")
OIFS="$IFS"
IFS=$'\n'
for file in $all; do
output="${file%.*}_preprocessed.png"
if [[ "${file%.*}" = *_preprocessed ]] && [ ${include} = false ]; then
continue
fi
if [[ "${file##*.}" = "pdf" || "${file##*.}" = "PDF" ]] ; then
rm_file=true
old_file=$file
base_file_name=$(basename "${file%.*}")
file=".tmp_${base_file_name}.png"
magick $old_file $file
fi
if [ "$(( $(identify -format "%w ${turn} %h" ${file}) ))" = "1" ]; then
ffmpeg -i ${file} -frames:v 1 -vf scale=-1:719:force_original_aspect_ratio=decrease,curves=m="${curve}",hue=s=0,format=monob -pix_fmt rgb32 ${output} -y
else
ffmpeg -i ${file} -frames:v 1 -vf scale=719:-1:force_original_aspect_ratio=decrease,curves=m="${curve}",hue=s=0,format=monob,transpose=1 -pix_fmt rgb32 ${output} -y
fi
if [ $rm_file == true ]; then
rm_file=false
rm ${file}
fi
done
IFS=$OIFS
else
if [ -z "${input}" ]; then
echo "No input file provided !" 1>&2
exit 1
fi
if [ -z "${output}" ]; then
output="${input%.*}_preprocessed.png"
fi
if [[ "${input##*.}" = "pdf" || "${input##*.}" = "PDF" ]] ; then
rm_file=true
old_file=$input
base_file_name=$(basename "${input%.*}")
input=".tmp_${base_file_name}.png"
magick $old_file $input
fi
if [ "$(( $(identify -format "%w ${turn} %h" ${input}) ))" = "1" ]; then
ffmpeg -i ${input} -frames:v 1 -vf scale=-1:719:force_original_aspect_ratio=decrease,curves=m="${curve}",hue=s=0,format=monob -pix_fmt rgb32 ${output} -y
else
ffmpeg -i ${input} -frames:v 1 -vf scale=719:-1:force_original_aspect_ratio=decrease,curves=m="${curve}",hue=s=0,format=monob,transpose=1 -pix_fmt rgb32 ${output} -y
fi
if [ $rm_file == true ]; then
rm_file=false
rm ${input}
fi
fi