Vous êtes ici Codes PHP et MySQL > Images > Ajouter automatiquement un logo en filigrane...

 

Ajouter automatiquement un logo en filigrane (watermark) sur ses images

Pour éviter de se faire voler ses images, le mieux est d'ajouter un petit logo dessus. Ce script permet de définir la position du logo, la marge depuis le bord et la transparence de ce logo. Il prend en charge les formats gif, jpg et png. Comme le traitement est long, le fichier peut être sauvegardé en cache au format png. Dans ce cas là, il n’est créé que s’il n’existe pas, ou s’il est plus récent que l’image et le logo.

Il faut ajouter ces deux lignes dans le fichier .htaccess :
addhandler WaterMark jpg gif jpeg png
action WaterMark /watermark.php

Il faut également modifier les constantes CACHE_PATH (chemin du répertoire cache) et LOGO_PATH (chemin du fichier logo).

La position (en bas à droite), la marge par rapport au bord (10 pixels) et la transparence (75%) du logo sont modifiables avec la ligne :
$watermarker = new Watermarker(LOGO_PATH, POSITION_BOTTOM, POSITION_RIGHT, 10, 10, 75);
 
forty
Site de l'auteur voir
[23] sources en PHP voir
Code vu 21387 fois
Enregistré le 29 Mai 2008
  • Digg ce code sur digg.com
  • Bookmark ce code sur del.icio.us
  • Bookmark ce code sur Google
  • Bookmark ce code sur Yahoo
  • Ajoute Ajouter automatiquement un logo en filigrane (watermark) sur ses images
  • Partage ce code sur Facebook
 
 
 
 

Code Source


01.
02.
03.
04.
05.
06.
07.
08.
09.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
 
<?php
/******************************************************************************/
/*                                                                            */
/*                       __        ____                                       */
/*                 ___  / /  ___  / __/__  __ _____________ ___               */
/*                / _ \/ _ \/ _ \_\ \/ _ \/ // / __/ __/ -_|_-<               */
/*               / .__/_//_/ .__/___/\___/\_,_/_/  \__/\__/___/               */
/*              /_/       /_/                                                 */
/*                                                                            */
/*                                                                            */
/******************************************************************************/
/*                                                                            */
/* Titre          : Ajouter automatiquement un logo en filigrane...           */
/*                                                                            */
/* URL            : http://www.phpsources.org/scripts398-PHP.htm              */
/* Auteur         : forty                                                     */
/* Date édition   : 29 Mai 2008                                               */
/* Website auteur : http://www.toplien.fr/                                    */
/*                                                                            */
/******************************************************************************/

/* ne pas oublier d'ajouter les lignes suivantes dans le fichier .htaccess :
addhandler WaterMark jpg gif jpeg png
action WaterMark /watermark.php
*/

// répertoire contenant le cache
define('CACHE_PATH'rtrim($_SERVER['DOCUMENT_ROOT'], '/\\') . '/cache');
// chemin du logo à ajouter en filigrane (watermark)
define('LOGO_PATH'rtrim($_SERVER['DOCUMENT_ROOT'], '/\\') . '/stamp.png');

$imagePath rtrim($_SERVER['DOCUMENT_ROOT'], '/\\') . $_SERVER['REQUEST_URI'];
$watermarker = new Watermarker(LOGO_PATH, 
                                               POSITION_BOTTOMPOSITION_RIGHT,
                                              1010, 
                                               75);
$watermarker->display($imagePath9CACHE_PATH);

// à partir d'ici vous n'avez normalement rien à changer
define('POSITION_TOP', -1);
define('POSITION_MIDDLE'0);
define('POSITION_BOTTOM'1);
define('POSITION_LEFT', -1);
define('POSITION_RIGHT'1);

class Watermarker {

    var $stampPath null;
    var $vAlign POSITION_LEFT;
    var $hAlign POSITION_TOP;
    var $vMargin 5;
    var $hMargin 5;
    var $alpha 100;


    function Watermarker($stampPath//chemin du logo
                      $vAlign=POSITION_TOP,  // alignement vertical du logo
                      $hAlign=POSITION_LEFT// alignement horizontal du logo
                      $vMargin 5,   //marge verticale du logo
                      $hMargin 5// marge horizontale du logo
                      $transparence=100) { // pourcentage de transparence du logo
        $this->stampPath $stampPath;
        $this->vAlign $vAlign;
        $this->hAlign $hAlign;
        $this->alpha $transparence/100;
    }

    function openImage($path) {
        if ($original_image_info getimagesize($path)) {
            $original_image_imagetype $original_image_info[2];
            if ($original_image_imagetype == IMAGETYPE_GIF) {
                return imagecreatefromgif($path);
            } 
            elseif ($original_image_imagetype == IMAGETYPE_JPEG) {
                return imagecreatefromjpeg($path);
            } 
            elseif ($original_image_imagetype == IMAGETYPE_PNG) {
                return imagecreatefrompng($path);
            } else {
                return false;
            }
        } else {
            $ext strtolower(substr($pathstrrpos($path'.') + 1));
            switch($ext){
                case 'png' :
                    return imagecreatefrompng($path);
                    break;
                case 'gif' :
                    return imagecreatefromgif($path);
                    break;
                case 'jpg' :
                case 'jpeg' :
                    return imagecreatefromjpeg($path);
                    break;
                default :
                    return false;
            }
        }
    }

    // On donne l'image d'origine et le tampon à apposer
    function makeOutput($imagePath){
        // Ouverture des images
        if(!($image $this->openImage($imagePath))){
            return false;
        }
        if(!($stamp $this->openImage($this->stampPath))){
            return false;
        }
        // Dimension des images
        $imageWidth imagesx($image);
        $imageHeight imagesy($image);
        $stampWidth imagesx($stamp);
        $stampHeight imagesy($stamp);

        // Calcul de la position
        if($this->hAlign==POSITION_MIDDLE){
            $stampX floor(($imageWidth/2)-($stampWidth/2));
        }elseif($this->hAlign==POSITION_RIGHT){
            $stampX $imageWidth-$stampWidth-$this->hMargin;
        } else {
            $stampX $this->hMargin;
        }

        if($this->vAlign==POSITION_MIDDLE){
            $stampY floor(($imageHeight/2)-($stampHeight/2));
        }elseif($this->vAlign==POSITION_BOTTOM){
            $stampY $imageHeight-$stampHeight-$this->vMargin;
        } else {
            $stampY $this->vMargin;
        }

        // On crée l'image de sortie
        $output imagecreatetruecolor($imageWidth$imageHeight);
        
        //copie l'image de fond
        imagecopy($output$image0000$imageWidth$imageHeight);
        imagedestroy($image);

        //copie le watermark
        for($y=$stampY$y<$stampY+$stampHeight$y++){
            for($x=$stampX$x<$stampX+$stampWidth$x++){

                $RGB imagecolorat($output$x$y);

                // Calcul de la poisition correspondante sur le tampon
                $x2    $x $stampX;
                $y2    $y $stampY;

                // On récupère la couleur du pixel courant sur l'image
                $RGB imagecolorsforindex($output$RGB);
                // On récupère la couleur du pixel courant sur le tampon
                $stampRGB imagecolorsforindex($stamp, 
                                          imagecolorat($stamp$x2$y2));

                // Lecture des données de transparence
                $stampAlpha round(((127-$stampRGB['alpha'])/127), )* 
                                     $this->alpha;

                // Mélange de couleur de pixels de l'image et du tampon
                $RGB['red'] = round((($RGB['red']*(1-$stampAlpha))+
                                            ($stampRGB['red']*$stampAlpha)));
                $RGB['green'] = round((($RGB['green']*(1-$stampAlpha))+
                                               ($stampRGB['green']*$stampAlpha)));
                $RGB['blue'] = round((($RGB['blue']*(1-$stampAlpha))+
                                             ($stampRGB['blue']*$stampAlpha)));

                $RGB imagecolorexact($output$RGB['red'], 
                                                             $RGB['green'], 
                                         $RGB['blue']);
                if ($RGB 0) {
                    $RGB imagecolorallocate($output$RGB['red'], 
                                                                    $RGB['green'], 
                                                                    $RGB['blue']);
                }
                if ($RGB 0) {
                    $RGB imagecolorclosest($output$RGB['red'], 
                                                                    $RGB['green'], 
                                                                    $RGB['blue']);
                }

                // Dessine le pixel
                imagesetpixel($output$x$y$RGB);
            }
        }

        imagedestroy($stamp);

        return $output;
    }

    function display($imagePath//chemin de l'image
                  $quality=9// 0 = pas de compression -> 9 = compression maximum
                  $cachePath null) { //répertoire cache
        if ($cachePath) {
            $cacheName $cachePath '/' md5($imagePath) . '.png';
            if (!file_exists($cacheName) ||
                (@filemtime($cacheName) < @filemtime($imagePath)) || 
                (@filemtime($cacheName) < @filemtime($this->stampPath))) {
                imagepng($this->makeOutput($imagePath), $cacheName$quality);
            }
            header('Content-Type: image/png');
            readfile($cacheName);
        } else {
            header('Content-Type: image/png');
            imagepng($this->makeOutput($imagePath));
        }
    }
}
?>

 

Fonctions du code

: Définit une constante - (PHP 4, PHP 5)
: -
: Retourne la taille d'une image - (PHP 4, PHP 5)
: Crée une nouvelle image à partir d'un fichier ou d'une URL - (PHP 4, PHP 5)
: Crée une nouvelle image à partir d'un fichier ou d'une URL - (PHP 4, PHP 5)
: Crée une nouvelle image à partir d'un fichier ou d'une URL - (PHP 4, PHP 5)
: Trouve la position de la dernière occurrence d'un caractère dans une chaîne -...
: Renvoie une chaîne en minuscules - (PHP 4, PHP 5)
: Retourne un segment de chaîne - (PHP 4, PHP 5)
: Retourne la largeur d'une image - (PHP 4, PHP 5)
: Retourne la hauteur de l'image - (PHP 4, PHP 5)
: Arrondit à l'entier inférieur - (PHP 4, PHP 5)
: Crée une nouvelle image en couleurs vraies - (PHP 4 >= 4.0.6, PHP 5)
: Copie une partie d'une image - (PHP 4, PHP 5)
: Détruit une image - (PHP 4, PHP 5)
: Retourne l'index de la couleur d'un pixel donné - (PHP 4, PHP 5)
: Retourne la couleur associée à un index - (PHP 4, PHP 5)
: -
: Retourne l'index de la couleur donnée - (PHP 4, PHP 5)
: Alloue une couleur pour une image - (PHP 4, PHP 5)
: Retourne l'index de la couleur la plus proche d'une couleur donnée - (PHP...
: Dessine un pixel - (PHP 4, PHP 5)
: Calcule le md5 d'une chaîne - (PHP 4, PHP 5, PECL hash:1.1-1.3)
: Vérifie si un fichier ou un dossier existe - (PHP 4, PHP 5)
: Lit la date de dernière modification du fichier - (PHP 4, PHP 5)
: Envoie une image PNG vers un navigateur ou un fichier - (PHP 4, PHP 5)
: Envoie un en-tête HTTP - (PHP 4, PHP 5)
: Affiche un fichier - (PHP 4, PHP 5)
Commentaires
Bonjour,

j'ai un soucis lorsque je veux utiliser votre script.

J'ai modifier le chemin vers mon repertoire de cache, ainsi que le chemin vers le logo en png

Mes images à protéger sont dans un repertoire images/zooms/

Si je comprend bien le fonctionnement, il faut que je met dans ce dossier le fichier watermark.php ainsi que le fichier .htaccess contenant c'est 2 lignes :
addhandler WaterMark jpg gif jpeg png
action WaterMark /images/zooms/watermark.php


L'image ne saffiche pas et quand je veux accéder à cette image j'ai une erreur:
Parse error: syntax error, unexpected '}' in /home/xxxxx/sd/xxxxxxx/www/images/zooms/zoom_smf31.jpg on line 76

et je n'arrive pas a trouver de solution. auriez vous une idée de mon erreur ?
 
Hello, nice code

but when i try i've got this error :

Warning: Cannot modify header information - headers already sent by (output started at /home/intranet/www/HollidaysPictures/affiche_album.php:6) in /home/intranet/www/HollidaysPictures/watermark.php on line 199


and he diplayed the source code of the image.
 
you must not have a space or other caracters before <?php
 
bonjour votre script fonctionne très bien mais je voudrais qu'il ne fonctionne pas pour un de mes dossier je m'explique :

Je voudrais qu'il soit effectif que pour répertoire wordpress qui est à la racine de mon www/

pas pour le sous répertoire zenphoto est ce possible?
 
Pour limiter à un répertoire il faut essayer de mettre dans le .htaccess :

<Directory /wordpress/*>

        addhandler WaterMark jpg gif jpeg png

        action WaterMark /watermark.php

</Directory>
 
Voici le htaccess que j'ai ca fonctionne pas.

<Directory /zenphoto/albums/upload/*>
addhandler WaterMark jpg gif jpeg png
action WaterMark /watermark.php
</Directory>

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress
 
Je m'explique je voudrais que seules soient watermarkées les photos dans le dossier zenphoto/albums/upload/
Dans upload j'ai des sous dossiers.
J'ai essayé de placer la commande que vous m'avez indiqué dans le htaccess mais ca ne fonctionne pas.
J'ai une erreur 500.
 
Il y a une fonction PHP qui permet de merger 2 images
Merger une image
En 1 ligne c'est fait !
 
comment faire lorsque l'on a pas de chemin pour les photos puisqu'elles sont stockées dans la base de donnée et arrivée par ftp ?
 
Merci !!
 
Bonjour,

J'ai des milliers d'erreurs NOTICE dans mon log apache :
Use of undefined constant POSITION_TOP - assumed 'POSITION_TOP' in /www/MONSITE/htdocs/images/Protected/watermark.php on line 67 , referer: http://monsite/une_page.html
même chose sur POSITION_LEFT et POSITION_MIDDLE
J'ai fait quelques modifs pour que le watermark qui est appliqué soit différent selon la taille de l'image et je suis franchement nullisime mais je ne vois pas trop quelle betise j'ai pu faire ... peut-être que ce n'est pas moi ?
est-ce du au script toutes ces notices ? y-a-t-il quelque chose à faire pour régler ça ?
Par avance merci pour votre aide.

 
 tu as du supprimer par erreur le  "define('POSITION_TOP', -1);".  et les autres define.
 
Re-bonjour ..

j'ai découvert d'autres erreurs apache (encore plus nombreuses ... au secours) :

PHP Notice:  imagecolorat(): 118,-12 is out of bounds in /MONSITE//images/Protected/15/une_image_a_proteger.jpg&w=475&h=267&ei=vJJei=vJJfUOGaOKjT0QXX1IHwBw&zoom=1&iact=hc&vpx=86&vpy=195&dur=68&hovh=168&hovw=300&tx=162&ty=71&sig=106517849870450824411&page=1&tbnh=85&tbnw=15

Mêmes questions, c'est moi ? c'est normal ? est-ce qu'il y a quelquechose à faire ?

Et sinon, en dehors de ces erreurs, tout fonctionne nickel mais je voudrais vraiement éviter ces logs à rallonge (sans réduire le niveau d'alerte si possible) car fail2ban les analyse continuellement

 

 

 

 
 
j'ai mis : new Watermarker(LOGO_PATH,POSITION_MIDDLE, POSITION_MIDDLE,0,0,35)

that's it :) ?
 
 ton script essaye visiblement de lire la valeur d'un pixel avec des coordonnées en dehors de l'image. C'est peut-être un problème à cause d'une image trop petite pour le watermark.
 
Oui, tu avais raison ... le watermark est trop haut .. j'ai fait un test sur la largeur et selon la largeur de l'image, c'est tel ou tel watermark qui est appliqué mais il faudrait que je fasse la même chose sur la hauteur .. galère .. ça va en faire des if else ...  enfin, je sais d'ou ca vient, merci pour ton aide.

maintenant j'ai un autre soucis. j'ai un composant qui appelle des images et les mets en background. le script watermark ne fonctionne pas sur ce type d'appels. aurais-tu une petite orientation pour solutionner ça stp ?

voilà ce que ce composant donne :

<div id="lbImage" style=" background-image: url(http://monsite.net/index.php?option=com_ninjaboard&amp;view=attachment&amp;id=5&amp;post=17&amp;format=file); width: 450px; height: 600px; visibility: visible; zoom: 1; opacity: 1; "><a id="lbPrevLink" href="#" style="height: 600px; "></a><a id="lbNextLink" href="#" style="display: none; height: 600px; "></a></div>

et en fouinant un peu avec les outils webmaster du navigateur, on peut la récupérer sans problème, voilà alors ce que ça donne :

<body style="margin: 0px;"><img style="-webkit-user-select: none; cursor: -webkit-zoom-in; " src="http://monsite.net/index.php?option=com_ninjaboard&amp;view=attachment&amp;id=5&amp;post=17&amp;format=file" width="246" height="328"></body>
 
Ajouter un commentaire
Code de sécurité

Attention: Les champs marqués d'une étoile * sont obligatoires
 

Connexion

 
 

Images

 
 

PHP

 
 
        Publicité