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 10487 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 ?
 
Ajouter un commentaire
Code de sécurité

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

Connexion

 
 

Images

 
 

PHP

 
 
 
Php 5 Livre PHP

Php 5
 
    Offres d'emploi

Plus de 500 offres d'emploi PHP/MySQL

Offres d'emploi
 
    Editeur PHP
 
        Publicité