#! /bin/bash
# mpir.sh : My Personnal Image Resizer
# Matthias Meusburger (http://www.meusburger.net/matthias)
# Septembre 2004 - Août 2005
# Script sous licence GPL

# v0.2 Changelog :
# possibilité de ne pas redimensionner les images : option -n
# possibilité de mettre le logo en bas à gauche plutôt qu'à droite : option -g

# v0.3 Changelog :
# Les images ne sont redimensionnées que si leur taille est supérieure à la taille maximum définie

# v0.4 Changelog : 
# Possibilité d'appliquer des rotations automatiquement suivant les méta-données EXIF (switch -e, utilise exiftran)

# v0.5 Changelog :
# Shebang /bin/bash au lieu de /bin/sh
# Ajout de doublequotes
# Réajustement des droits : 1ere opération

# v0.6 Changelog : 
# Destruction des fichiers 'Thumbs.db'

# Définition des paramètres par défaut
allextensions='*.jpg *.JPG';
extensions='*.jpg';
qualite='80';
taille='1024x1024'
repertoire='.';
logo='';
resize=1;
rotation=0;
emplacementlogo='East';

# Nombre d'images traitees
nbImages=0;

# Affiche l'usage
usage() {
	echo "`basename $0` est un script de redimensionnement récursif d'images utilisant ImageMagick";
	echo
	echo "Usage : `basename $0` [-l logo_a_ajouter -t taille_des_images -q qualite -r repertoire_de_travail -h -n -g -e]";
	echo
	echo "-e : une rotation est appliquée pour orienter les photos correctement lorsque necessaire (utilise exiftran)";
	echo "-g : le logo est placé en bas à gauche plutôt qu'à droite";
	echo "-l : logo à ajouter à l'image (placé en bas à droite par défaut)";
	echo "-n : no resize : les images ne sont pas redimensionnées"
	echo "-q : qualité JPG ($qualite par défaut)";
	echo "-r : répertoire où sont situées les images";
	echo "-t : taille à laquelle redimensionner l'image (1024x1024 par défaut, conserve les proportions, seulement si l'image est plus grande)";
	echo
	echo "Exemple : `basename $0` -l logo.gif -t 1024x1024 -q 80 -r Images"
	echo
	exit -1;
}

# Effectue les traitements d'images sur les fichiers du répertoire courant
traitements() {

	# Si le répertoire contient des fichiers souhaités
	if [ `ls -l $allextensions 2>/dev/null | wc -l` -gt 0 ] ; then 

	# On met les bons droits au besoin
	echo 'Ajustement des droits des fichiers...'
	for files in * ; do
		chmod u+rw "$files";
	done

	# On supprime le fichier Thumbs.db s'il existe
	rm -v 'Thumbs.db'
	# Note : on pourrait également chercher une seule fois à la racine avec find : find . -name Thumbs.db -print0 | xargs -0 rm -v

	# On met des noms de fichiers normalisés
	echo 'Normalisation des noms de fichier...';
	for files in $allextensions ; do
		# On remplace les espaces par des sous-tirets
		mv -v "$files" `echo "$files" | tr ' ' '_' | tr '[A-Z]' '[a-z]'` ;
	done



	
	for files in $extensions ; do
	
		if [ "$rotation" -eq 1 ]; then
			exiftran -ai "$files";
		fi

		if [ "$resize" -eq 1 ] ; then 
			echo 'Redimensionnement des images et ajustement de la qualité...';
			avant=`identify "$files" | awk '{print $3} {print $5}'`;
			dimensions=$(echo $avant | awk '{print $1}');
			longueur=$(echo $dimensions | awk -F'x' '{print $1}');
			hauteur=$(echo $dimensions | awk -F'x' '{print $2}');
		
			# Si une des deux dimensions de l'image à traiter est supérieure à la taille maximum, on redimensionne
			if [ $longueur -gt $longueurmax -o $hauteur -gt $hauteurmax ]; then
				mogrify -resize $taille -quality $qualite "$files"
			else
				# Sinon, on change juste la qualité
				mogrify -quality $qualite "$files"
			fi
			
			apres=`identify "$files" | awk '{print $3} {print $5}'`;
			echo "$files :" $avant "--taille:$taille,qualite:$qualite-->" $apres;
		fi
		
		if [ -n "$logo" ]  ; then
			echo 'Ajout du logo ' $logo;
			composite -gravity South$emplacementlogo -compose Over $logo "$files" "$files"
		fi

		# Increment
		nbImages=`expr $nbImages + 1`;
	done

	
	else 
		echo "Le répertoire est vide";
	fi
}

# Parcours les répertoires récursivement et lance les traitements 
parcours() {
	# On effectue les traitements sur les fichiers du répertoire courant
	traitements;
	
	# Pour chaque sous-répertoire, 
	for files in * ; do 
		if [ -d "$files" ] ; then
			# Si on peut y entrer, on continue le parcours
			chmod u+rwx "$files";
			cd "$files";
			if [ $? -eq 0 ] ; then
				echo "J'entre dans $files";
				parcours;
				# Et on revient
				cd ..;
			else
				echo "Impossible d'entrer dans $files";
			fi
		fi
	done																	
}

# Prends un nom de fichier en paramètre et l'affiche sous sa forme absolue
absName() {
	cd $(dirname $1 ) ; echo $(pwd)/$(basename $1)
}

# Récupération des paramètres : 
while getopts t:q:l:r:ehng option ; do
case $option in
	t) taille=$OPTARG;;
	q) qualite=$OPTARG;;
	l) logo=$(absName $OPTARG);;
	r) repertoire=$OPTARG;;
	h) usage;;
	n) resize=0;;
	g) emplacementlogo='West';;
	e) rotation=1;;
esac
done;

#Si un logo a été précisé, on teste si le fichier existe
if [ -n $logo ] && ! [ -r $logo ] ; then
	echo "Le logo $logo n'existe pas ou n'est pas lisible!";
	exit -1;
fi

# On determine longueur max et hauteur max
longueurmax=$(echo $taille | awk -F'x' '{print $1}');
hauteurmax=$(echo $taille | awk -F'x' '{print $2}');

# Affichage des paramètres : 
echo "Taille des images     : $taille";
echo "Qualite des images    : $qualite";
echo "Logo à ajouter        : $logo";
echo "Répertoire de travail : $repertoire";


# On se rend dans le répertoire souhaité
if [ -d $repertoire ] ; then
	cd $repertoire;
	if [ $? -eq 0 ] ; then
		echo "J'entre dans" `pwd`;
	else 
		echo "Impossible d'entrer dans $repertoire";
		exit -1;
	fi
else
	echo $repertoire : "Le répertoire n'existe pas";
	exit -1;
fi

parcours;
echo "$nbImages image(s) traitée(s)";

