 |
Fonctions de redimensionnement
d'images
Utilisation avec base de données ou
dossier |
tous les tutos |
|
|
Avant-propos |
But : Uploader des images sans se soucier de leur "poids",
puisqu'on va les redimensionner pour s'adapter aux dimensions
d'affichage final sur notre site (et créer des pictos a la volée).
En effet, les visiteurs peuvent très bien charger des images "haute
résolution", très gourmandes en "temps de chargement" et en espace
disque.
- adapter après "upload" la taille des images à nos besoins (si
nécessaire)
(gain de temps de chargement et d'espace disque).
- créer des images de prévisualisation (pictos) à la volée. |
3 étapes
1- Liste : liste des images présentes + options AJOUTER -
MODIFIER - SUPPRIMER
2- Formulaire : affichage du formulaire (en fonction de
l'option choisie)
3- Traitement : (faisant appel aux fonctions de
redimensionnement "physique")
- gestion des erreurs,
(options AJOUTER - MODIFIER) :
- vérification des dimensions de l'image "uploadée", et
redimensionnement automatique,
- création automatique d'un picto,
- enregistrement des photo et picto dans un dossier (répertoire
avec "droits en écriture"),
- enregistrement de leurs noms (et d'un commentaire) dans la table
(base de données).
(option SUPPRIMER) :
- suppression de la fiche dans la table,
- suppression des photo et picto concernées dans le dossier.
|
On a donc besoin |
1- d'une base de données MySQL
(MABASE),
dans laquelle est créée une table (MATABLE) contenant au moins les
champs suivants :
- NUM (INT - 11 - auto-incrementé : clé primaire - NotNull)
- COMMENT1 (VARCHAR - 255 - Null)
- PHOTO1 (VARCHAR - 255 - Null)
- PICTO1 (VARCHAR - 255 - Null) |
2- d'un dossier déprotégé
(repIMAGES) (avec "droits en écriture" : chmod 777). |
3- des fichiers :
- _connexion.php contient
les paramètres de connexion à votre base
- MONFICHIER_LISTE.php
- MONFICHIER_FORM.php
- MONFICHIER_TRAITER.php |
4- des fonctions de redimensionnement :
- fctaffichimage.php
- fctredimimage.php
- fctcropimage.php
Voir
FONCTIONS de redimensionnement d'images |
_connexion.php |
masquer le code
<?php
// -------------------------------------------------------------------------
// Paramètres persos
$host = "localhost"; // voir hébergeur
$user = "login"; // identifiant de votre BD (vide ou "root" en local)
$pass = "password"; // mot de passe de votre BD (vide en local)
$bdd = "MABASE"; // nom de la BD
// -------------------------------------------------------------------------
// connexion a la base de donnees
@mysql_connect($host,$user,$pass) or die("Impossible de se connecter");
@mysql_select_db("$bdd") or die("Impossible de se connecter");
// -------------------------------------------------------------------------
?> |
|
Création de
la table MATABLE |
masquer le code
CREATE TABLE `MATABLE` (
`NUM` INT( 11 ) NOT NULL AUTO_INCREMENT ,
`COMMENT1` VARCHAR( 255 ) ,
`PHOTO1` VARCHAR( 255 ) ,
`PICTO1` VARCHAR( 255 ) ,
PRIMARY KEY ( `NUM` )
) TYPE = MYISAM ; |
|
MONFICHIER-LISTE.php |
masquer le code
<?php
// connexion a la base de donnees
include("_connexion.php");
// FONCTION de redimensionnement "a l affichage"
include("fctaffichimage.php");
// -----------------------------------------------------------------------------------------
// La base de donnees (MABASE) avec une table (MATABLE)
// La table doit contenir (au moins) les champs suivants :
// - NUM (INT - 11 - auto-incremente - NotNull)
// - COMMENT1 (VARCHAR - 255 - Null)
// - PHOTO1 (VARCHAR - 255 - Null))
// - PICTO1 (VARCHAR - 255 - Null)
// Important : conserver le champ COMMENT1, il est necessaire en mode AJOUTER
// -----------------------------------------------------------------------------------------
// mettre le nom de la table dans une variable :
$table = 'MATABLE';
// REMARQUE : on peut utiliser ce fichier pour PLUSIEURS TABLES (de meme structure)
// $table = $_GET['CAT'];
// (preciser le nom de la table a l'appel du fichier : MONFICHIER-LISTE.php?CAT=MATABLE)
// -----------------------------------------------------------------------------------------
// Les photos et pictos sont stockes dans un dossier deprotege en ecriture
$chemincourt = 'repIMAGES/';
// -----------------------------------------------------------------------------------------
// sélection de toutes les fiches de la table
$query = 'SELECT * FROM '.$table.' WHERE PHOTO1<>"" ORDER BY NUM DESC';
$result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>MONFICHIER-LISTE.php</title>
</head>
<body><div align="center">
TABLE : <?php echo $table; ?><br/>
<a href="MONFICHIER-FORM.php?CAT=<?php echo $table; ?>&TRAITER=AJOUTER">AJOUTER NOUVEAU</a>
<br/>
<table border="1">
<tr>
<?php
// -----------------------------------------------------------------------------------------
// AFFICHAGE tant qu'il y a des fiches
while ($val = mysql_fetch_array($result))
{ ?>
<td>
<a href="MONFICHIER-FORM.php?CAT=<?php echo $table; ?>
&TRAITER=MODIFIER&NUM=<?php echo $val['NUM']; ?>">MODIFIER</a> -
<a href="MONFICHIER-FORM.php?CAT=<?php echo $table; ?>
&TRAITER=SUPPRIMER&NUM=<?php echo $val['NUM']; ?>">Supprimer</a><br/>
<?php echo $val[COMMENT1]; ?><br/>
<?php if ($val[PICTO1] != "") { ?>
<img alt="" border="0" <?php fctaffichimage($chemincourt.$val['PICTO1'], 100, 100) ?> />
<?php } ?>
</td>
<?php
} // fin while
// -----------------------------------------------------------------------------------------
?>
</tr>
</table>
</div>
</center></body></html>
<?php // liberation de la ressource et deconnexion
mysql_free_result($result);
mysql_close();
?> |
|
dans cet exemple :
- affichage en ligne les pictos des photos présentes dans la table de la
base de données,
- avec pour chacune des boutons "Modifier" et "Supprimer"
- et un bouton "Ajouter Nouveau" |
MONFICHIER-FORM.php |
|
dans cet exemple : on affiche
- le bon formulaire en fonction de l'option choisie (ajouter, modifier,
supprimer)
- la fiche concernée (photo et commentaire) |
MONFICHIER_TRAITER.php |
masquer le code
<?php
// connexion a la base de donnees
include("_connexion.php");
// FONCTIONS de redimensionnement "physique"
include("fctredimimage.php"); // ("proportionnel")
include("fctcropimage.php"); // ("crop centre")
// -----------------------------------------------------------------------------------------
// Répertoire des photos et pictos (déprotégé)
$cheminlong = realpath('repIMAGES').'\\';
$chemincourt = 'repIMAGES/';
// -----------------------------------------------
// recuperation du nom de la TABLE
$table=$_POST['CAT'];
// recuperation du mode de traitement (AJOUTER - MODIFIER - SUPPRIMER)
$TRAITER=$_POST['TRAITER'];
// -----------------------------------------------
// Restrictions sur les fichiers :
$FileSizeMax = 1000000;
$ExtfichierOK = '" jpg jpeg png gif"'; // (NB : l espace avant .jpg est important)
// -----------------------------------------------------------------------------------------
// GESTION DES ERREURS (upload fichier)
// (ne concerne que les options "AJOUTER" et "MODIFIER")
// ---------------------------------------------------------------------------------------
$erreurfile = 0;
// si un fichier N a PAS ete poste
if ($_FILES['PHOTO1']['size']<=0 && $TRAITER == 'AJOUTER') {
$erreurfile = 1;
echo 'Erreur ! Pas de fichier IMAGE défini<br/>';
echo '<a href="#" onclick="history.back()">Retour au formulaire</a>';
}
if ($_FILES['PHOTO1']['size']<=0 && $TRAITER == 'MODIFIER' && $_POST['PHOTO1avant']=='') {
$erreurfile = 1;
echo 'Erreur ! Pas de fichier IMAGE défini<br/>';
echo '<a href="#" onclick="history.back()">Retour au formulaire</a>';
}
// -----------------------------------------------
// si un fichier a bien ete poste
if ($_FILES['PHOTO1']['size']>0 && ($TRAITER == 'AJOUTER' || $TRAITER == 'MODIFIER')) {
// on verifie les restrictions sur les fichiers
// extension
$tabfile = explode('.',$_FILES['PHOTO1']['name']);
$extension = $tabfile[sizeof($tabfile)-1]; // dernier element
$extension = strtolower($extension); // on met en minuscule
if (strpos($ExtfichierOK,$extension)=='') {
$erreurfile = 1;
echo 'Erreur ! Ce n\'est pas un fichier IMAGE (jpg, jpeg, png ou gif)<br/>';
echo '<a href="#" onclick="history.back()">Retour au formulaire</a>';
}
// taille maxi autorisee
elseif ($_FILES['PHOTO1']['size'] > $FileSizeMax) {
$erreurfile = 1;
echo 'Erreur ! Taille de fichier supérieure à la taille maxi autorisée ('.$FileSizeMax.' octets)<br/>';
echo '<a href="#" onclick="history.back()">Retour au formulaire</a>';
}
elseif (UPLOAD_ERR_OK<>0 && UPLOAD_ERR_FORM_SIZE==2) {
$erreurfile = 1;
echo 'Erreur ! Taille de fichier trop important ('.$FileSizeMax.' octets)<br/>';
echo '<a href="#" onclick="history.back()">Retour au formulaire</a>';
}
}
// -----------------------------------------------------------------------------------------
// si PAS d ERREUR : traitement
if ($erreurfile == 0) {
// -----------------------------------------------------------------------------------------
// TRAITEMENT du formulaire
// -----------------------------------------------------------------------------------------
if ($TRAITER == 'AJOUTER') {
// recuperation des elements du formulaire
$COMMENT = mysql_real_escape_string($_POST['COMMENT1']);
// -----------------------------------------------
// ENREGISTREMENT du COMMENT dans la BASE DE DONNEES par INSERT
$listechamps = 'COMMENT1';
$listevaleurs = '\''.$COMMENT.'\'';
$queryNEW = 'INSERT INTO '.$table.'('.$listechamps.') VALUES('.$listevaleurs.')';
$resultNEW = mysql_query($queryNEW) or die('Erreur SQL ! '.$queryNEW.'<br/>'.mysql_error());
// -----------------------------------------------
// recuperation du NUM en selectionnant LA DERNIERE fiche cree
$query = 'SELECT MAX(NUM) AS NUMmax FROM '.$table;
$result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error());
$val_NUMmax = mysql_fetch_array($result);
$NUM = $val_NUMmax['NUMmax'];
}
// -----------------------------------------------------------------------------------------
if ($TRAITER == 'MODIFIER') {
// recuperation des elements du formulaire
$NUM = intval($_POST['NUM']);
$COMMENT = mysql_real_escape_string($_POST['COMMENT1']);
// -----------------------------------------------
// ENREGISTREMENT dans la BASE DE DONNEES par UPDATE
$SQL = 'UPDATE '.$table.' SET COMMENT1=\''.$COMMENT.'\' WHERE NUM= '.$NUM;
mysql_query($SQL);
// -----------------------------------------------
$PHOTO_avant = $_POST['PHOTO1avant'];
$PICTO_avant = $_POST['PICTO1avant'];
// par defaut
$PHOTO = $PHOTO_avant;
$PICTO = $PICTO_avant;
}
// -----------------------------------------------------------------------------------------
// TRAITEMENT des champs FILE (PHOTOS et PICTOS)
// -----------------------------------------------------------------------------------------
if (($TRAITER == 'AJOUTER') || ($TRAITER == 'MODIFIER')) {
if(isset($_FILES['PHOTO1']) && $_FILES['PHOTO1']['size']>0)
{
// -----------------------------------------------
// upload de la PHOTO sous forme NUM_nomfichier
// NUM etant la CLE primaire de la fiche, ce qui rend le nom UNIQUE
$PHOTO = $NUM.'_'.$_FILES['PHOTO1']['name'];
// -----------------------------------------------
// pour eviter tout probleme par la suite, on remplace jpeg par jpg
$PHOTO = str_replace('.JPEG','.jpg',$PHOTO);
$PHOTO = str_replace('.jpeg','.jpg',$PHOTO);
// autre modification : remplacement des caracteres genants (espaces)
$PHOTO = str_replace(' ','-',$PHOTO);
// -----------------------------------------------
// extension
$tabfile = explode('.',$PHOTO);
$extension = $tabfile[sizeof($tabfile)-1]; // dernier element
$extension = strtolower($extension); // on met en minuscule
// -----------------------------------------------
// enregistrement du fichier image dans le repertoire
$tempfile = $_FILES['PHOTO1']['tmp_name'];
move_uploaded_file($tempfile, $chemincourt.$PHOTO);
// -----------------------------------------------
// REDIMENSIONNEMENT et SAUVEGARDE de la PHOTO (si necessaire)
// -----------------------------------------------
// on veut : une photo de 600 pixels maxi de large
// ecraser (remplacer) la photo (meme rep, meme nom)
$redimPHOTOOK = fctredimimage(600,0,'','',$chemincourt,$PHOTO);
// $redimPHOTOok =1 si OK
// -----------------------------------------------
// REDIMENSIONNEMENT et SAUVEGARDE du PICTO
// -----------------------------------------------
// on veut : un picto carre de 100 x 100 pixels (avec crop)
// enregistrer en ajoutant 'picto_' devant le nom de la photo
// dans le meme repertoire que la photo
$redimPICTOok = fctcropimage(0,0,'','picto_'.$PHOTO,$chemincourt,$PHOTO);
$redimPICTOok = fctredimimage(100,100,'','',$chemincourt,'picto_'.$PHOTO);
// $redimPICTOok =1 si OK
// nom du picto pour la BD
if ($redimPICTOok == 1) {
$PICTO = 'picto_'.$PHOTO;
} else {
$PICTO = $PHOTO;
}
// -----------------------------------------------
// SUPPRESSION des anciennes PHOTOS dans le repertoire
if ($TRAITER == 'MODIFIER') {
if ($PHOTO_avant != '' && $PHOTO_avant != $PHOTO && $PHOTO_avant != $PICTO) {
unlink($cheminlong.$PHOTO1avant); // Suppression de la photo
}
if ($PICTO_avant != '' && $PICTO_avant != $PHOTO && $PICTO_avant != $PICTO) {
unlink($cheminlong.$PICTO_avant); // Suppression du picto
}
}
// -----------------------------------------------
}
// --------------------------------------------------
// enregistrement dans la table par UPDATE
$SQL = 'UPDATE '.$table.' SET PHOTO1=\''.$PHOTO.'\' WHERE NUM= '.$NUM;
mysql_query($SQL);
$SQL = 'UPDATE '.$table.' SET PICTO1=\''.$PICTO.'\' WHERE NUM= '.$NUM;
mysql_query($SQL);
}
// -----------------------------------------------------------------------------------------
if ($TRAITER == 'SUPPRIMER') {
// recuperation des elements du formulaire
$NUM = intval($_POST['NUM']);
$PHOTO_avant=$_POST['PHOTO1avant'];
$PICTO_avant=$_POST['PICTO1avant'];
// -----------------------------------------------
// SUPPRESSION de la fiche numero NUM dans la BD
$query = 'DELETE FROM '.$table.' WHERE NUM = '.$NUM ;
$result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error());
// -----------------------------------------------
// SUPPRESSION des PHOTOS dans le repertoire
if ($PHOTO_avant != '') {
unlink($cheminlong.$PHOTO_avant); // Suppression de la photo
}
if ($PICTO_avant != '' && $PICTO_avant != $PHOTO_avant) {
unlink($cheminlong.$PICTO_avant); // Suppression du picto
}
}
// -----------------------------------------------------------------------------------------
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>MONFICHIER-TRAITER.php</title>
</head>
<body><div align="center">
<?php
// -----------------------------------------------------------------------------------------
// AFFICHAGE
// -----------------------------------------------------------------------------------------
if (($TRAITER == 'AJOUTER') || ($TRAITER == 'MODIFIER')) {
// -----------------------------------------------
// recuperation des donnees de la nouvelle fiche pour reaffichage
$query = 'SELECT * FROM '.$table.' WHERE NUM = '. $NUM;
$result = mysql_query($query) or die('Erreur SQL ! '.$query.'<br/>'.mysql_error());
$val = mysql_fetch_array($result);
// -----------------------------------------------
if ($TRAITER == 'AJOUTER') { echo 'LA PHOTO a été AJOUTEE.<br/>'; }
if ($TRAITER == 'MODIFIER') { echo 'LA PHOTO a été MODIFIEE.<br/>'; }
?>
<a href="MONFICHIER-LISTE.php?CAT=<?php echo $table; ?>">RETOUR</a><br/><br/>
<?php echo $val['COMMENT1']; ?><br/>
<?php if ($val['PHOTO1'] != "") { ?>
<img alt="" border="0" src="<?php echo $chemincourt.$val['PHOTO1']; ?>">
<?php } ?>
<?php
}
// -----------------------------------------------------------------------------------------
if ($TRAITER == 'SUPPRIMER') {
?>
LA PHOTO a été SUPPRIMEE.<br/>
<a href="MONFICHIER-LISTE.php?CAT=<?php echo $table; ?>">RETOUR</a>
<?php
}
// -----------------------------------------------------------------------------------------
} // fin du traitement si PAS d ERREUR
?>
</div>
</body></html>
<?php // Déconnexion
mysql_close(); ?> |
|
dans cet exemple :
TRAITEMENT :
0- gestion des erreurs
- Restrictions sur les fichiers : jpg, jpeg, png ou gif - 1Mo maxi
Si "AJOUTER" ou MODIFIER"
1- TELECHARGER la photo dans le répertoire
- PHOTO : on enregistre en ajoutant NUM- devant le nom de l'image
uploadée
NUM est le numéro auto -la CLE primaire- de la fiche dans la base de
données
On associe donc l'image à la fiche concernée et on rend le nom de
l'image unique.
(on évite ainsi toute confusion, même si on upload plus tard des images
de même nom)
2- REDIMENSIONNEMENT (si nécessaire) :
(on utilise les fonctions de redimensionnement "physique")
- PHOTO ? (ex. : on veut une largeur maxi de 600 pixels)
- PICTO ? (ex. : on veut un "carré" de 100 x 100 pixels --> crop
centré)
--> Si oui : on renomme le PICTO = picto-PHOTO
--> Si non : PICTO = PHOTO
3- Enregistrement dans la base de données (noms des photo et picto),
4- Suppression des anciens photo et picto du répertoire
Si "SUPPRIMER"
1- suppression de la fiche concernée dans la base de données,
2- supression des photo et picto concernés dans le répertoire. |
Compléments |
Utilisation dans un espace d'administration :
voir
PHP - ADMINISTRER en ligne - avec cookie ou
PHP - ADMINISTRER en ligne - avec session |
Utilisation par les visiteurs :
On doit d'abord récupérer l'IDvisiteur.
(le visiteur ne doit pas avoir accès à toute la base, mais seulement à
ses propres photos !)
- soit il a ses propres tables (ex. IDvisiteur_MATABLE1, ...)
- soit ajouter un champ IDvisiteur à la table MATABLE (et vérifier ses
droits d'accès avant ...) |
Traitement de plusieurs tables :
- Dans le fichier MONFICHIER_LISTE.php
Au lieu de :
$table = 'MATABLE';
On met :
$table = $_GET['CAT'];
- En précisant à l'appel du fichier (menu) :
<a href="MONFICHIER_LISTE.php?CAT=MATABLE1">MATABLE1</a>
<a href="MONFICHIER_LISTE.php?CAT=MATABLE2">MATABLE2</a> ...
- Dossiers images (déprotégés : chmod 777)
On crée autant de dossier que de tables : photosMATABLE1,
photosMATABLE2, ... |
Nombre de photos :
On peut gérer la saisie simultanée de plusieurs photos.
voir
Télécharger plusieurs fichiers simultanément
ou
Pour les formulaires :
PHOTO1, PHOTO2, ... PHOTOn (et COMMENT1, COMMENT2, ... COMMENTn)
Pour le traitement (adapter aussi pour l'enregistrement dans la BD) :
masquer le code
<?php
$NbrePhoto = n; // n est le nombre total de vos photos
for ($i=1;$i<=$NbrePhoto;$i++) {
....
le code en remplacant :
'PHOTO1' par 'PHOTO'.$i
'PICTO1' par 'PICTO'.$i
....
} |
|
images .bmp ?
Une solution consiste à convertir d'abord l'image .bmp en .png
voir
bmp2png / png2bmp -
imagecreatefromwbmp |
Utilisation avec un dossier |
Hypothèse
Vous avez un dossier "repPHOTOS" contenant déjà des images.
Vous souhaitez créer des images de prévisualisation (pictos), de 150 x
100 pixels maxi,
et les enregistrer dans le dossier "repPHOTOS/repPICTOS". |
NB S'assurer que les droits en écriture ont été donnés aux
dossiers (chmod ou via logiciel FTP) |
Principe
- ouvrir le répertoire,
- lire les fichiers
- redimensionner (si nécessaire) en fonction des conditions requises
--> utilisation de la fonction fctredimimage(...)
- enregistrer le picto dans le dossier de destination. |
Remarque
Par défaut, la fonction fctredimimage(...) ne redimensionne pas les
images plus petites que les dimensions spécifiées. Pour créer des
pictos, pas de problème. Sinon, Une adaptation de la fonction pourrait
être nécessaire. |
MONDOSSIER-REDIM.php |
masquer le code
<?php
// FONCTIONS de redimensionnement "physique"
include("fctredimimage.php");
// include("fctcropimage.php"); // (inutile ici)
// -----------------------------------------------------------------------------------------
// repertoire Source
$rep_Src = "repPHOTOS/";
// repertoire de Destination
$rep_Dst = "repPHOTOS/repPICTOS/";
// S'assurer que les droits en écriture ont été donnés aux dossiers (chmod ou via logiciel FTP)
// -----------------------------------------------------------------------------------------
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>MONDOSSIER_REDIM.php</title>
</head>
<body><center>
<?php
// -----------------------------------------------------------------------------------------
// Ouverture du dossier Source
$ouvredir = opendir($rep_Src);
// -----------------------------------------------------------------------------------------
// pour chaque fichier du repertoire ...
while ($img_Src = readdir($ouvredir)) {
// si le fichier existe
if(is_file($rep_Src.$img_Src)) {
// -----------------------------------------------
// CHOIX de redimensionnement : picto de 150 x 100 pixels maxi
// nom du picto : pict-(nom photo)
$img_Dst = 'pict-'.$img_Src;
// -----------------------------------------------
// REDIMENSIONNEMENT (si les conditions sont correctes)
$RedimOK = fctredimimage(150, 100, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
// -----------------------------------------------
if ($RedimOK == 1 ) {
// Affichage de confirmation d'écriture
echo 'Picto créé : '.$rep_Dst.$img_Dst.'...<br/>';
}
} // fin si existe
} // fin while
// -----------------------------------------------------------------------------------------
// Fermeture du dossier
closedir($ouvredir);
// -----------------------------------------------------------------------------------------
echo '<br/>Les pictos se trouvent dans le dossier '.$rep_Dst.'<br/>';
?>
</center>
</body></html> |
|
|
2009 - Jérôme Réaux |