Imagemagick et zenphoto pour votre galerie photo - le traitement des photos (4)

Publié le 17 juin 2008 par Gnomeinwonderland

Quatrième billet consacré à la mise en ligne ultra-rapide de photos dans une galerie photo motorisée par Zenphoto, en utilisant ImageMagick, des outils graphiques "classiques", et le tout mis en oeuvre par un script bash [voir le billet précédent sur la détection de la rotation des images].

Dans ce billet, on s'intéresse au traitement des photos à proprement parler.

Le traitement de nos photos doit donc se faire en fonction de la détection de son orientation.

Pour rappel, le but est d'intégrer un logo, un marquage de type "copyright" dans chacune de nos photos avant de les intégrer dans notre galerie photos. Ce marquage, nous l'avons déjà fait comme indiqué dans un précédent billet.

On utilise les logiciels convert et composite du pack ImageMagick :

  • convert pour appliquer les traitements à notre photo de base;
  • composite pour ensuite intégrer notre marquage.

Rappel : ce dont nous disposons

Nous disposons de plusieurs photo. Par exemple, celle-ci, qui a besoin d'être pivotée dans le bon sens :

Nous disposons également de nos masques de marquage : un au format paysage, et un au format portrait...

Voyons comment d'abord faire pivoter puis intégrer le marquage dans la photo originale pour obtenir une nouvelle photo "marquée"...

Nouvelle portion de script

Comme vu dans le billet précédent sur ce sujet, pour chaque photo on appelera ne fonction EXIF-ORIENT en lui passant en paramètre la variable $FILE qui contiendra le nom du fichier à traiter.
Au préalable, dans mon script j'aurais défini d'autres variables :
  • $ROTATION : un nombre qui représente (pour moi) l'orientation originale de la photo;
  • $HRESIZE et $VRESIZE sont les dimensions en pixels maximum pour le redimensionnement des photos;
  • $OPARAM : nombre de degrés à faire subir à ma photo originale;
  • $FILE : le nom du fichier photo à modifier;
  • $MASKpaysage et $MASKportrait sont les chemins complets des fichiers contenant les masques de marquage (à intégrer aux photos);
  • $DESTINATION est le répertoire où je sauvegarderai les nouvelles photos avec le marquage;
  • $TEMPJPG est un fichier temportaire : celui contenant la photo redimensionnée et pivotée si nécessaire, mais ne contenant pas encore le marquage.
Vu comme ça, ça fait un peu assommant, mais une fois que ces paramètres ont été écrits dans le fichier de script, on n'y touche plus. Ou alors on change une valeur dont on n'a plus à se souvenir où elle se trouve. C'est donc très confortable à utiliser...
Ca donnera quelque chose comme ça :

if [ $ROTATION = 0 ]
then
   convert $FILE -resize $HRESIZEx$VRESIZE -sharpen 1 -format jpg -quality 90 -rotate $OPARAM $TEMPJPG
   composite -compose src-in -dissolve 40 -format jpg -quality 90 $MASKpaysage $TEMPJPG $DESTINATION/$FILE
   elif [ $ROTATION = 270 ]
   then
   convert $FILE -resize $HRESIZEx$VRESIZE -sharpen 1 -format jpg -quality 90 -rotate $OPARAM $TEMPJPG
   composite -compose src-in -dissolve 40 -format jpg -quality 90 $MASKportrait $TEMPJPG $DESTINATION/$FILE
   elif [ $ROTATION = 90 ]
   then
   convert $FILE -resize $HRESIZEx$VRESIZE -sharpen 1 -format jpg -quality 90 -rotate $OPARAM $TEMPJPG
   composite -compose src-in -dissolve 40 -format jpg -quality 90 $MASKportrait $TEMPJPG $DESTINATION/$FILE
   fi

A la sortie, chaque photo a été redimensionnée et a subi une rotation pour être remise dans le bons sens...

Un peu d'explications...

Le rôle de convert est de préalablement traiter la photo, avec ou sans rotation.
La ligne de code suivante :
convert $FILE -resize $HRESIZEx$VRESIZE -sharpen 1 -format jpg -quality 90 -rotate $OPARAM $TEMPJPG
...sert à ceci :
  • je converti grace à la commande convert mon fichier ($FILE) en le redimensionnant aux mesures ne devant pas dépasser le nombre de ($HRESIZE) pixels horizontalement et de ($VRESIZE) pixels en hauteur;
  • j'applique un filtre d'accentuation (-sharpen 1) pour limiter le flou inhérent à toute réduction de la taille de photos;
  • j'indique que ma nouvelle photo sera un fichier jpeg (-format jpg) compressé en qualité 90% (-quality 90);
  • tant que j'y suis, je lui fait subir une rotation de ($OPARAM) degrés;
  • ...et le résultat avant incrustation de mon marquage, je le sauvegarde dans le fichier ($TMPJPG)
La ligne de code suivante :
composite -compose src-in -dissolve 40 -format jpg -quality 90 $MASKportrait $TEMPJPG $DESTINATION/$FILE
...sert à intégrer notre marquage dans la photo que nous venons de traiter :
  • avec la commence composite j'intègre une autre image à mon image source ($TMPJPG, si vous avez bien suivi jusque-là);
  • le mode de composition que je choisi (-compose src in) prend pour image de base de ma nouvelle image (dite image de destination) mon image source. Donc, toujours si vous suivez-bien, mon fichier ($TMPJPG);
  • l'image que j'ajoute à ma nouvelle composition est l'image ($MASKportrait);
  • je l'applique par dessus mon image source ($TMPJPG) mais en la rendant "transparente" à 40% (-dissolve 40);
  • ma nouvelle image composée, c'est-à-dire mon image de destination, est ($DESTINATION/$FILE), nom qui est en fait composé de deux variables : <chemin du répertoire de sauvegarde>/<nom de mon fichier original>;
  • comme dans le cas de convert, j'indique que ma photo de destination sera un fichier jpeg (-format jpg) compressé en qualité 90% (-quality 90).
Pas besoin de faire de rotation, puisque celle-ci a été réalisée via convert pour fabriquer mon fichier-photo temporaire ($TMPJPG)...
Résultat final : ma photo originale est bien redimensionnée et elle intègre en semi-transparence un logo "Creative Commons" dans le coin en haut à gauche.
Le prochain billet sur ce sujet sera le dernier : nous verrons le script complet, sa mise en place, et... comment envoyer les photos automatiquement à Zenphoto une fois qu'elles ont été traitées...