Watermark à la volée en php

Tous les benchmarks, vos résultats, vos tests.
Vos programmes, vos conseils logiciel
Votre matos, vos problèmes
Avatar de l’utilisateur
Aurelienazerty
Webmaster / Président
Réactions :
Messages : 25137
Inscription : septembre 27, 2002, 9:41 pm

Watermark à la volée en php

Message par Aurelienazerty »

Après la solution de david pour convertir en masse des images, voici un petit script qui permet de mettre des watermark sur des images à la volée.
Il faut tout d'abord un script php:

Code : Tout sélectionner

<?php
include ('config.lib.php');
if (isset($_GET["img"])) $img = REALPATH.$_GET["img"];
else $img = REALPATH."images/articles/15/Dscn8700.jpg";

//On tente de l'ouvrir
//Si ça ne marche pas, on vire le "wk_"
if (!@fopen($img, 'r'))
	$img = str_replace("wk_", "", $img);
	
//die($img);

mettre_watermark($img, REALPATH."images/lan/watermark.png");

function mettre_watermark($img, $watermark) {

	//on demande les dimension de l'image $img:
	$size = @getimagesize($img);	
	//largeur
	$largeur=$size[0];
	//longeur
	$longeur=$size[1];
	
	//on regarde si c'est png jpg gif
	$type=$size[2];
	//on charge l'image $img dans $img_big:
	switch($type)
	{
		case 2: $img_big = imagecreatefromjpeg($img); break;
		case 3: 
			$img_big = imagecreatefrompng($img);
			imagesavealpha($img_big,TRUE);
			break;
		case 1: $img_big = imagecreatefromgif($img);break;
	}
	imagealphablending($img_big,TRUE);
	
	$destImage=imagecreatetruecolor($largeur,$longeur);
	imagecopyresampled($destImage,$img_big,0,0,0,0,$largeur,$longeur,$largeur,$longeur);
	
	//Copie du watermark
	//die($watermark);
	$size_water = getimagesize($watermark);	
	//largeur
	$largeur_water=$size_water[0];
	//longeur
	$longeur_water=$size_water[1];
	//on regarde si c'est png jpg gif
	$type_water=$size_water[2];
	
	switch($type_water)
	{
		case 2: $img_water = imagecreatefromjpeg($watermark); break;
		case 3: 
			$img_water = imagecreatefrompng($watermark);
			imagesavealpha($img_water,TRUE);
			break;
		case 1: $img_water = imagecreatefromgif($watermark);break;
	}
	imagealphablending($img_water,TRUE);
	
	$img_water2 = @imagecreatetruecolor($largeur_water, $longeur_water);
	$bgc = imagecolorallocate($img_water2, 255, 255, 255 );
	////Couleur de fond
	$c_fond = imagecolorallocate($img_water2, 255, 255, 255);//Rouge
	imagefilledrectangle($img_water2, 0,0, $largeur_water, $longeur_water, $c_fond);
	// on change les occurences $c_fond en transparent
	$trans=imagecolortransparent($img_water2, $c_fond);
	imagealphablending($img_water2,FALSE);
	imagesavealpha($img_water2,TRUE);
	imagecopyresampled($img_water2,$img_water,0,0,0,0,$largeur_water,$longeur_water,$largeur_water,$longeur_water);
	imagepng($img_water2,$img_water2);
	
	
	//Positionnement en bas à droite
	$position_y = $longeur - $longeur_water;
	$position_x = $largeur - $largeur_water;
	imagecopy($destImage, $img_water2, $position_x,$position_y,0,0,$largeur_water,$longeur_water);
	//on envoie l'image au navigateur:
	
	switch($type)
		{

			case 2: 
			//on enverra au navigateur un fichier de type image au format jpeg:
			header("Content-type: image/jpeg");
			//on envoie l'image reduire au navigateur:
			@imagejpeg($destImage); 
			break;

			case 3://on enverra au navigateur un fichier de type image au format jpeg:
			header("Content-type: image/png");
			//on envoie l'image reduire au navigateur:
			@imagepng($destImage); 
			break;

			case 1: //on enverra au navigateur un fichier de type image au format jpeg:
			header("Content-type: image/gif");
			//on envoie l'image reduire au navigateur:
			@imagegif($destImage);
			break;

			default: false ;

	}
	imagedestroy($destImage);
	imagedestroy($img_water);
	imagedestroy($img_water2);
	imagedestroy($img_big);
}
?>
Ensuite, il faut modifier le fichier .htaccess de la manière suivante:

Code : Tout sélectionner

RewriteRule (.*)images/(.*)/wk_(.*) /include/watermark.php?img=/images/$2/wk_$3 [L]
Dans mon cas, toutes les images préfixées par un "wk_" seront "wartermarkées"

Exemple: