Tatouage numérique en masse (watermark)

Mise à jour :  Entre temps, le plugin « Easy Watermark » est sorti et fait le travail de manière moins pénible.


J’ai décidé la semaine dernière d’insérer l’URL de mon blog dans les images, cet ajout en transparence s’appelle un tatouage numérique ou watermark.

Pour ce faire, j’ai mis au point deux petits scripts :

  • Le premier pour parcourir mes fichiers à traiter, lancer le deuxième script puis fondre les images.
  • Le deuxième pour créer une image qui contiendra que mon tatouage numérique.

J’aurais pu ne faire qu’un script, mais le fait de les avoir séparé m’a permis de tester une partie relativement empirique de la manipulation.

Tout d’abord, il y a quelques pré-requis :

  • Installer ImageMagick (« apt-get install imagemagick » pour les debian like)
  • Pouvoir exécuter des scripts bash (pour ma part, je suis sous Linux, ça va avec).
  • Avoir une syntaxe reconnaissable pour ses photos (tous mes dessins sont en YYYY-MM-DD_totolitoto.jpeg), il ne faut pas tatouer des images que ne nous appartiennent pas, ça ne se fait pas.

Une fois cela fait, j’ai dupliqué mon dossier wp-content dans le dossier wp-content2 (puis cela fait une sauvegarde car on va écraser le contenu de wp-content).

Mon premier script :
add_watermark.sh

#!/bin/bash

ORG_DIR="./wp-content/uploads/"
WDIR="./watermark"
[ ! -e "$WDIR" ] && mkdir $WDIR

for i in $(find $ORG_DIR -regex ".*.jpe?g" -regextype posix-extended -print)
do
  new=$(echo $i|sed -e 's/wp-content2/wp-content/') #On regle notre fichier destination
  file=$(basename $new)
  # Si le fichier commence par 201x et ne contient pas le mot modele, on le traite
  if [ $(expr match $file "20[01][0-9].*") -ne 0 -a $(expr match $file ".*modele.*") -eq 0 ]
  then
    echo "$i $new"
    # On recupere la taille de l'image
    SIZE=$(identify $i |awk '{print $3}')
    wmfile="$WDIR/watermark_${SIZE}.png"
    # Si le fichier watermark n'existe pas, on le cree
    [ ! -e "$wmfile" ] && ./do_watermark.sh $SIZE $WDIR
    composite -dissolve 30% -gravity south $wmfile $i $new
  fi
done

On voit l’appel au script do_watermark.sh, ce dernier prends 2 arguments, la taille (par exemple 800×600) et, optionnellement, le dossier qui contiendra le fichier généré.

do_watermark.sh

#!/bin/bash

SIZE=$1
[ -z "$SIZE" ] && echo -e "Usage: $0 LxH\n\texemple: $0 800x600" && exit

WDIR="."
[ -n "$2" -a -d "$2" ] && WDIR=$2

text="http://blog.alko.fr"

largeur=$(echo $SIZE|cut -d'x' -f1)
hauteur=$(echo $SIZE|cut -d'x' -f2)

# Indice determine de maniere empirique par rapport a la taille de mon texte et a la police utilisee (Source-Code-Pro dispo chez Adobe)
indice="0.075"
pointsize=$(echo "$largeur*$indice"|bc|cut -d'.' -f1)

# Positionement du texte
#h_position="North" #Au haut
#h_position="center" #Au milieu
h_position="South" #En bas

convert -size ${largeur}x${hauteur} canvas:none -font Source-Code-Pro-Bold -pointsize $pointsize -gravity $h_position \
 -draw "text 1,1 '$text'" -channel RGBA -blur 0x6 -fill white -stroke darkgrey \
 -draw "text 0,0 '$text'" $WDIR/watermark_${SIZE}.png

Vous pouvez dé-commenter la ligne qui vous sied le mieux pour gérer votre position en hauteur de tatouage numérique et re-commenter les autres (variable h_position).
Comme dit dans les commentaires, j’utilise la police Source Code Pro, librement téléchargeable chez Adobe.
Si vous utilisez une autre police ou que votre texte ne fait pas vraiment 20 caractères, il vous faudra modifier l’appel à la commande convert et l’indice qui permet d’adapter la taille de la police au nombre de caractères.

Pour finir, on lance notre script add_watermark.sh et advienne que pourra.

PS: Il existe une multitude d’options amusantes que l’on peut utiliser pour générer son tatouage, elles sont listées sur le site d’imagemagick.