Protéger ses images en PHP grâce à un watermark

Publié le 2 mars 2011 - Developpement Web. Tags : ,

Comment se protéger un minimum des aspirateurs d’images ? En y ajoutant un Watermark ! Bien sûr, cela est loin d’être la parade ultime (un copieur en série aura vite fait de faire un traitement par lot sur Photoshop); mais puisque PHP nous offre la possibilité de le faire sans trop de prise de tête, autant en profiter, ça limitera toujours un peu les dégâts.

On trouve souvent des scripts très compliqués pour effectuer ce genre de manipulation, mais le concept est très simple : il s’agit de fusionner une image à protéger avec un watermark.

Voici donc un petit code maison, sous forme de fonction acceptant un seul paramètre : $img (chemin de l’image à tagger) :

function WaterMark($img) {

Pour commencer, il est nécessaire d’ouvrir notre image contenant le watermark, afin d’en extraire les dimensions et de lancer le processus de création (notez qu’ici on notre watermark est un fichier .gif, adaptez le imagecreatefromgif() correspondant selon vos besoins):

$wm = imagecreatefromgif('logo.gif');
$wm_w = imagesx($wm);
$wm_h = imagesy($wm);

On récupère ensuite les informations de l’image à tagger, en examinant ses propriétés via le tableau retourné par getimagesize() (on peut aussi faire des switch ($img_infos[2]) ça dépend des goûts) :

$wm_img = imagecreatetruecolor($wm_w, $wm_h);
$img_infos = getimagesize($img);
if($img_infos[2] == 'gif') {$wm_img = imagecreatefromgif($img);}
else if ($img_infos[2] == 'png') {$wm_img = imagecreatefrompng($img);}
else {$wm_img = imagecreatefromjpeg($img);}

Avant de procéder à la fusion, il faut positionner le watermark en utilisant les informations recueillies dans les deux images (un simple calcul de différence hauteurs et largeurs fait l’affaire):

$x_pos = $img_infos[0] - $wm_w;
$y_pos = $img_infos[1] - $wm_h;

Ces informations nous servent à fusionner les images (imagecopymerge()), processus ayant pour effet de coller le watermark à l’endroit désiré (ici en bas à droite) sur notre image à protéger. Le résultat est donc une nouvelle image.

imagecopymerge($wm_img, $wm, $x_pos, $y_pos, 0, 0, $wm_w, $wm_h, 100);
imagejpeg($wm_img, $img);

Pour finir on vide le tampon :

imagedestroy($wm_img);
imagedestroy($wm);
}

Voilà, c’est tout ! Par contre faites attention aux liens relatifs (emplacement de cette fonction par rapport à votre watermark logo.gif, par ex.), où sinon cela ne fonctionnera pas. De même, pensez à donner les droits appropriés (CHMOD 767) aux dossiers et fichiers qui seront utilisés par ce script. Enfin, n’oubliez pas que dans cette configuration, votre ancienne photo sera écrasée par la nouvelle.

Ceci étant dit, je vous laisse bidouiller ce snippet à votre guise pour l’adapter à vos besoins, il est par exemple très facile à insérer dans une boucle afin d’effectuer un traitement par lots si vous n’avez pas que des posters de 2mo à protéger !


Articles sur ce thème :