Ajouter 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);


Information sur les mises à jour

Dernière mise à jour :

13 Août 2019
fonctionnement du code vérifié

36 512  vues
Compatibilité du code
PHP 5, PHP 7 et PHP 8
  code classé dans   Images - Graphisme
  code source classé dans   Images - Graphisme
 
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 un logo en filigrane (watermark) sur ses images

Auteur : forty
Website auteur : http://www.toplien.fr/
Date édition : 29 Mai 2008
Date mise a jour : 13 Aout 2019

Rapport de la maj:
- fonctionnement du code vérifié
*/
/*------------------------------*/

/* 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_BOTTOM, POSITION_RIGHT,
10, 10,
75);
$watermarker->display($imagePath, 9, CACHE_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($path, strrpos($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, $image, 0, 0, 0, 0, $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), 2 )*
$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));
}
}
}
?>
<?php
/*------------------------------*/
/*
Titre : Ajouter un logo en filigrane (watermark) sur ses images

Auteur : forty
Website auteur : http://www.toplien.fr/
Date édition : 29 Mai 2008
Date mise a jour : 13 Aout 2019

Rapport de la maj:
- fonctionnement du code vérifié
*/
/*------------------------------*/

/* 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_BOTTOM, POSITION_RIGHT,
10, 10,
75);
$watermarker->display($imagePath, 9, CACHE_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($path, strrpos($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, $image, 0, 0, 0, 0, $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), 2 )*
$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 - Doc officielle PHP

   php.net  
Description
Versions PHP
    define
Définit une constante
PHP 4, 5, 7 et 8
    filemtime
Lit la date de dernière modification du fichier
PHP 4, 5, 7 et 8
    file_exists
Vérifie si un fichier ou un dossier existe
PHP 4, 5, 7 et 8
    floor
Arrondit à l'entier inférieur
PHP 4, 5, 7 et 8
    getimagesize
Retourne la taille d'une image
PHP 4, 5, 7 et 8
    header
Envoie un en-tête HTTP brut
PHP 4, 5, 7 et 8
    imagecolorallocate
Alloue une couleur pour une image
PHP 4, 5, 7 et 8
    imagecolorat
Retourne l'index de la couleur d'un pixel donné
PHP 4, 5, 7 et 8
    imagecolorclosest
Retourne l'index de la couleur la plus proche d'une couleur donnée
PHP 4, 5, 7 et 8
    imagecolorexact
Retourne l'index de la couleur donnée
PHP 4, 5, 7 et 8
    imagecolorsforindex
Retourne la couleur associée à un index
PHP 4, 5, 7 et 8
    imagecopy
Copie une partie d'une image
PHP 4, 5, 7 et 8
    imagecreatefromgif
Crée une nouvelle image depuis un fichier ou une URL
PHP 4, 5, 7 et 8
    imagecreatefromjpeg
Crée une nouvelle image depuis un fichier ou une URL
PHP 4, 5, 7 et 8
    imagecreatefrompng
Crée une nouvelle image depuis un fichier ou une URL
PHP 4, 5, 7 et 8
    imagecreatetruecolor
Crée une nouvelle image en couleurs vraies
PHP 4, 5, 7 et 8
    imagedestroy
Détruit une image
PHP 4, 5, 7 et 8
    imagepng
Envoie une image PNG vers un navigateur ou un fichier
PHP 4, 5, 7 et 8
    imagesetpixel
Dessine un pixel
PHP 4, 5, 7 et 8
    imagesx
Retourne la largeur d'une image
PHP 4, 5, 7 et 8
    imagesy
Retourne la hauteur de l'image
PHP 4, 5, 7 et 8
    md5
Calcule le md5 d'une chaîne
PHP 4, 5, 7 et 8
    readfile
Affiche un fichier
PHP 4, 5, 7 et 8
    return
Retourne le controle du programme au module appelant
PHP 4, 5, 7 et 8
    round
Arrondit un nombre à virgule flottante
PHP 4, 5, 7 et 8
    rtrim
Supprime les espaces de fin de chaîne
PHP 4, 5, 7 et 8
    strrpos
Cherche la position de la dernière occurrence d'une sous-chaîne dans une chaîne
PHP 4, 5, 7 et 8
    strtolower
Renvoie une chaîne en minuscules
PHP 4, 5, 7 et 8
    substr
Retourne un segment de chaîne
PHP 4, 5, 7 et 8

[11]

  • avatar

    Forty

    25 Sept 2012 à 10:57

     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.

  • avatar

    Invité

    25 Sept 2012 à 10:53

    j'ai mis : new Watermarker(LOGO_PATH,POSITION_MIDDLE, POSITION_MIDDLE,0,0,35)
    that's it :) ?

  • avatar

    Forty

    25 Sept 2012 à 10:39

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

  • avatar

    Invité

    25 Sept 2012 à 10:32

    Bonjour,
    J'ai des milliers d'erreurs NOTICE dans mon log apache : 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.

  • avatar

    Invité

    19 Mars 2012 à 17:32

    Merci !!

  • avatar

    Invité

    28 Août 2011 à 16:07

    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 ?

  • avatar

    Invité

    16 Avril 2011 à 12:54

    Il y a une fonction PHP qui permet de merger 2 images imagecopymerge () En 1 ligne c'est fait !

  • avatar

    Invité

    21 Oct 2010 à 11:55

    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.

  • avatar

    Invité

    21 Oct 2010 à 11:07

    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

  • avatar

    Forty

    16 Sept 2010 à 18:05

    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>

  • avatar

    Invité

    16 Sept 2010 à 17:40

    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?

Minimum 10 mots. Votre commentaire sera visible après validation.


 Autres snippets qui pourraient vous intéresser

Ajouter avec PHP des Tweets - POST

Compatibilité : PHP 5, PHP 7, PHP 8

Utilisez la lib OAuth 8.1.1 PHP (ex: abraham/twitteroauth) que vous pouvez télécharger sur le site.

Ajouter des boutons Twitter et Facebook

Compatibilité : PHP 5, PHP 7, PHP 8

Ajoute des boutons Twitter et Facebook au bas de tous vos messages. Explications + exemples.

* Requêtes exécutées avec Recherche Contextuelle

  Les derniers scripts PHP / MySQL

PmWiki 2.5.9

logo PmWiki
Langue langue fr
Date  hier
Taille 0.68 Mo
Catégorie Wiki

CubeCart 6.6.2

logo CubeCart
Langue langue en
Date 16 Avril 2026
Taille 16 Mo
Catégorie Ecommerce

Magepattern 1.1

logo Magepattern
Langue langue fr
Date 15 Avril 2026
Taille 6 Mo
Catégorie CMS

PHP 8.5.5

logo PHP
Langue langue us
Date 12 Avril 2026
Taille 32 Mo
Catégorie PHP

PHP 8.4.20

logo PHP
Langue langue us
Date 12 Avril 2026
Taille 30 Mo
Catégorie PHP

Serendipity 2.6.0

logo Serendipity
Langue langue fr
Date 11 Avril 2026
Taille 15 Mo
Catégorie Blogs
avatar

Forty

  29 Mai 2008

  SOURCE   Télécharger

Information sur les mises à jour

Dernière mise à jour :

13 Août 2019
fonctionnement du code vérifié

36 512 Vues
Compatibilité du code
PHP 5, PHP 7, PHP 8
54 codes

Catégorie :  Images - Graphisme

Ajoute à votre image un cadre noir 3D
Ajouter un logo en filigrane (watermark) sur ses images
Composantes d'une image
concaténation d'images pour faire des sprites CSS
Connaitre la taille d'une image et son format
Créer des images fractales
Créer une vignette avec GD en se basant sur le type d'image
Création d'images miniatures
Création d'images miniatures carrés
Crée des titres sympa
Creer un camembert 2D facilement
Crop d'une image JPEG
Dessine un polygone régulier
Dessine un polygone regulier plein
Donne la couleur opposée d'une couleur
Ecrire des nombres dans une images, sans police
Ecrire un texte dans une image avec retour à la ligne automatique
Ecrire un texte dans une image PNG
Ecrire un texte sur une image - Code de base
Effet miroir sur des images
Effet solarisation
Egalisation des couleurs d'une image
Explorer et visionner des images dans un répertoire
Extrait un canal de couleur d'une image
Fabrication d'une vignette et sauvegarde de la vignette
Fonction hexadécimal vers RVB (RGB)
Fonctions imagecreatefrombmp et imagebmp
Générer une image aléatoire
GD/Graphiques
Homothétie d'une image
Image aléatoire
Image en noir et blanc
Image transparente
Images Miniatures
Ligne diagonale
Modifications des composantes
Photo du jour choisi de manière aléatoire à partir d'un répertoire
Redimensionne des images JPG et PNG
Redimensionner image en gardant les proportions
Redimensionner une image
Redimensionner une image sans distorsion
Regarde si l'image est présente sur le serveur
Représentation graphique
Rotation de triangle
Rotation image
Sélectionne et affiche la dernière image mise à jour
Sépia aspect ancien
Symétrie horizontale
Taille image maximum en pixels
Texte multi-lignes sur une image avec une police PostScript Type1
Texte ombré en police TrueType
Transparence simple sur une image
Un masque sur une image
Une galerie de photos automatique depuis un répertoire