1. Avant-Propos

1-A. Redimensionnement d'image

Quand on parle de "redimensionnement" d'image, il faut distinguer :

1- Redimensionnement "à l'affichage" :
ou comment afficher ses images à la taille d'affichage voulue ?
L'image elle-même n'est pas modifiée, seules ses dimensions d'affichage sont recalculées.
- fonction fctaffichimage() : redimensionner des images "à l'affichage"

2- Redimensionnement "physique" :
modification du "poids" de l'image (nouvelle image aux dimensions spécifiées),
- fonction fctredimimage() : L'image finale est redimensionnée "en proportions".
- fonction fctdeformimage() : L'image finale est redimensionnée "sans proportions" (déformée).
- fonction fctcropimage() : L'image finale est "coupée" ("crop centré").

3- "Signature" d'image (petit "plus" !)
- fonction fcttexteimage() : "Signature" de l'image (ajout d'un texte à l'image : copyright, date, ou légende de l'image).

4- Utilisation :
- avec base de données : upload, traitement (redimensionner image + création picto), enregistrement.
- dans un dossier (répertoire) : redimensionner des images déjà présentes.

Traitement d'image (PHP) :
Voir bibliothèque GD - bibliothèque ImageMagick

Les formats traités ici : .jpg , .jpeg , .png

Autres formats :
- images .gif
Il semble que GD ne traite pas les gifs animés ou à fond transparent.
- images .bmp
Une solution consiste à convertir d'abord l'image en .png (ou en .wbmp)
voir bmp2png / png2bmp -  imagecreatefromwbmp

1-B. Téléchargez l'archive

PHP - Fonctions de redimensionnement d'images Téléchargement (archive zip)
PHP - Fonctions de redimensionnement d'images PHP-FONCTION-REDIMENSIONNER-IMAGE.zipTéléchargez l'archive zip : PHP-FONCTION-REDIMENSIONNER-IMAGE.zip
(miroirTéléchargez l'archive zip : PHP-FONCTION-REDIMENSIONNER-IMAGE.zip)
Vous pouvez déposer vos commentaires ou poser vos questions sur cette source : 5 commentaires Donner une note à l'article (5)

1-C. Class d'Upload

Cet article traite des fonctions de redimensionnement d'images, ainsi que des exemples d'utilisation.
Néanmoins, ABCIWEBVoir le Profil de ABCIWEB s'est aussi intéressé au redimensionnement dans sa Class d'UploadVoir la discussion d'ABCIWEB : Class d'Upload.

2. Redimensionnement "à l'affichage"

Redimensionnement "à l'affichage"
Original-paysage Original-portrait
Original-paysage-120x80 Original-portrait-120x80


Pour afficher une image en HTML, on utilise les options width et height de la balise <img /> :

 
Sélectionnez
<img alt="" src="repimg/monimage.jpg" width="120" height="100" />


Pour afficher l'image en conservant ses proportions de départ, on n'indique qu'un seul des deux paramètres, le navigateur se chargeant de calculer le deuxième :

 
Sélectionnez
<img alt="" src="repimg/monimage.jpg" width="120" />   ou   <img alt="" src="repimg/monimage.jpg" height="100" />


Mais comment faire pour que l'image tienne au mieux dans une "case" de W_max sur H_max pixels ?
HTML ne suffit plus ... Il faut calculer les dimensions optimales.
L'image source n'est pas modifiée, seules ses dimensions d'affichage sont recalculées.


La fonction : fctaffichimage($img_Src, $W_max, $H_max)

La fonction affiche :  src="..." width="..." height="..." pour la balise <img ... />

Les paramètres
- $img_Src : URL (chemin + NOM) de l'image Source
- $W_max : LARGEUR maxi d'affichage --> ou 0
- $H_max : HAUTEUR maxi d'affichage --> ou 0

- si l'image est plus petite que la zone --> on conserve les dimensions de l'image source
- si $W_max ET $H_max non définis --> on conserve les dimensions de l'image source
- si $W_max = 0 --> LARGEUR auto (libre)
- si $H_max = 0 --> HAUTEUR auto (libre)
- sinon : on adapte les dimensions
 
Sélectionnez
Exemple : <img alt="" <?php fctaffichimage('repimg/monimage.jpg', 120, 100) ?> />
fctaffichimage.php
Sélectionnez
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction de redimensionnement A L'AFFICHAGE
// ---------------------------------------------------
// La FONCTION : fctaffichimage($img_Src, $W_max, $H_max)
// Les paramètres :
// - $img_Src : URL (chemin + NOM) de l'image Source
// - $W_max : LARGEUR maxi finale ----> ou 0 : largeur libre
// - $H_max : HAUTEUR maxi finale ----> ou 0 : hauteur libre
// ---------------------
// Affiche : src="..." width="..." height="..." pour la balise img
// Utilisation :
// &lt;img alt=&quot;&quot; &lt;?php fctaffichimage('repimg/monimage.jpg', 120, 100) ?&gt; /&gt;
// ---------------------------------------------------
function fctaffichimage($img_Src, $W_max, $H_max) {

 if (file_exists($img_Src)) {
   // ---------------------
   // Lit les dimensions de l'image source
   $img_size = getimagesize($img_Src);
   $W_Src = $img_size[0]; // largeur source
   $H_Src = $img_size[1]; // hauteur source
   // ---------------------
   if(!$W_max) { $W_max = 0; }
   if(!$H_max) { $H_max = 0; }
   // ---------------------
   // Teste les dimensions tenant dans la zone
   $W_test = round($W_Src * ($H_max / $H_Src));
   $H_test = round($H_Src * ($W_max / $W_Src));
   // ---------------------
   // si l'image est plus petite que la zone
   if($W_Src<$W_max && $H_Src<$H_max) {
      $W = $W_Src;
      $H = $H_Src;
   // sinon si $W_max et $H_max non definis
   } elseif($W_max==0 && $H_max==0) {
      $W = $W_Src;
      $H = $H_Src;
   // sinon si $W_max libre
   } elseif($W_max==0) {
      $W = $W_test;
      $H = $H_max;
   // sinon si $H_max libre
   } elseif($H_max==0) {
      $W = $W_max;
      $H = $H_test;
   // sinon les dimensions qui tiennent dans la zone
   } elseif($H_test > $H_max) {
      $W = $W_test;
      $H = $H_max;
   } else {
      $W = $W_max;
      $H = $H_test;
   }
   // ---------------------
 } else { // si le fichier image n existe pas
      $W = 0;
      $H = 0;
 }
 // ---------------------------------------------------
 // Affiche : src="..." width="..." height="..." pour la balise img
 echo ' src="'.$img_Src.'" width="'.$W.'" height="'.$H.'"';
 // ---------------------------------------------------
};
?>

3. Redimensionnement physique "proportionnel"

Redimensionnement physique "proportionnel"
Original-paysage Original-portrait
Original-paysage-120x80 Original-portrait-120x80

La fonction : fctredimimage ($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)

Redimensionnement "physique "en proportions" (conserve les proportions de l'image)
3 options
A- "normal" : image finale à HAUTEUR ET LARGEUR maxi fixes.
B- "hauteur" : image finale à HAUTEUR maxi fixe (largeur auto)
C- "largeur" : image finale à LARGEUR maxi fixe (hauteur auto)
NB :
Si l'image Source est plus petite que les dimensions indiquées : PAS de redimensionnement.
Mais on peut "forcer" le redimensionnement en ajoutant : $condition = 1; (voir le code)

Retourne la valeur :
- 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu,
- sinon rien (false)

Les paramètres :
- $W_max : LARGEUR maxi finale --> ou 0
- $H_max : HAUTEUR maxi finale --> ou 0
- $rep_Dst : répertoire de l'image de destination (déprotégé) --> ou ''
- $img_Dst : NOM de l'image de destination --> ou ''
- $rep_Src : répertoire de l'image source (déprotégé)
- $img_Src : NOM de l'image source

Les 3 options
A- si $W_max != 0 et $H_max != 0 --> à a LARGEUR maxi ET HAUTEUR maxi fixes
B- si $H_max != 0 et $W_max == 0 --> à HAUTEUR maxi fixe (largeur auto)
C- si $W_max == 0 et $H_max != 0 --> à LARGEUR maxi fixe (hauteur auto)
NB :
$rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
- si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire que l'image Source)
- si $img_Dst = '' --> $img_Dst = $img_Src (même nom que l'image Source)
- si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image Source !

Extensions :
- acceptées (traitées ici) : .jpg , .jpeg , .png
- $img_Dst et $img_Src doivent avoir la même extension (même type mime) !
Pour ajouter d'autres extensions :
Voir bibliothèque GD - bibliothèque ImageMagick
Exemple :
Sélectionnez
<?php
$redimOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($redimOK == 1) { echo 'Redimensionnement OK !'; }
?>
fctredimimage.php
Sélectionnez
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction de REDIMENSIONNEMENT physique "PROPORTIONNEL" et Enregistrement
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
// ---------------------
// La FONCTION : fctredimimage ($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
// Les paramètres :
// - $W_max : LARGEUR maxi finale --> ou 0
// - $H_max : HAUTEUR maxi finale --> ou 0
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
// - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// ---------------------
// 3 options :
// A- si $W_max!=0 et $H_max!=0 : a LARGEUR maxi ET HAUTEUR maxi fixes
// B- si $H_max!=0 et $W_max==0 : image finale a HAUTEUR maxi fixe (largeur auto)
// C- si $W_max==0 et $H_max!=0 : image finale a LARGEUR maxi fixe (hauteur auto)
// Si l'image Source est plus petite que les dimensions indiquées : PAS de redimensionnement.
// ---------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = ''   : $rep_Dst = $rep_Src (même répertoire que l'image Source)
// - si $img_Dst = '' : $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l'image source !
// ---------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour Ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ---------------------
// UTILISATION (exemple) :
// $redimOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if ($redimOK==true) { echo 'Redimensionnement OK !';  }
// ---------------------------------------------------
function fctredimimage($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
 $condition = 0;
 // Si certains paramètres ont pour valeur '' :
 if ($rep_Dst=='') { $rep_Dst = $rep_Src; } // (même répertoire)
 if ($img_Dst=='') { $img_Dst = $img_Src; } // (même nom)
 // ---------------------
 // si le fichier existe dans le répertoire, on continue...
 if (file_exists($rep_Src.$img_Src) && ($W_max!=0 || $H_max!=0)) { 
   // ----------------------
   // extensions acceptées : 
	$extension_Allowed = 'jpg,jpeg,png';	// (sans espaces)
   // extension fichier Source
	$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
   // ----------------------
   // extension OK ? on continue ...
   if(in_array($extension_Src, explode(',', $extension_Allowed))) {
     // ------------------------
      // récupération des dimensions de l'image Src
      $img_size = getimagesize($rep_Src.$img_Src);
      $W_Src = $img_size[0]; // largeur
      $H_Src = $img_size[1]; // hauteur
      // ------------------------
      // condition de redimensionnement et dimensions de l'image finale
      // ------------------------
      // A- LARGEUR ET HAUTEUR maxi fixes
      if ($W_max!=0 && $H_max!=0) {
         $ratiox = $W_Src / $W_max; // ratio en largeur
         $ratioy = $H_Src / $H_max; // ratio en hauteur
         $ratio = max($ratiox,$ratioy); // le plus grand
         $W = $W_Src/$ratio;
         $H = $H_Src/$ratio;   
         $condition = ($W_Src>$W) || ($W_Src>$H); // 1 si vrai (true)
      }
      // ------------------------
      // B- HAUTEUR maxi fixe
      if ($W_max==0 && $H_max!=0) {
         $H = $H_max;
         $W = $H * ($W_Src / $H_Src);
         $condition = ($H_Src > $H_max); // 1 si vrai (true)
      }
      // ------------------------
      // C- LARGEUR maxi fixe
      if ($W_max!=0 && $H_max==0) {
         $W = $W_max;
         $H = $W * ($H_Src / $W_Src);         
         $condition = ($W_Src > $W_max); // 1 si vrai (true)
      }
      // ---------------------------------------------
      // REDIMENSIONNEMENT si la condition est vraie
      // ---------------------------------------------
      // - Si l'image Source est plus petite que les dimensions indiquées :
      // Par defaut : PAS de redimensionnement.
      // - Mais on peut "forcer" le redimensionnement en ajoutant ici :
      // $condition = 1; (risque de perte de qualité)
      if ($condition==1) {
         // ---------------------
         // creation de la ressource-image "Src" en fonction de l extension
         switch($extension_Src) {
         case 'jpg':
         case 'jpeg':
           $Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
           break;
         case 'png':
           $Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
           break;
         }
         // ---------------------
         // creation d une ressource-image "Dst" aux dimensions finales
         // fond noir (par defaut)
         switch($extension_Src) {
         case 'jpg':
         case 'jpeg':
           $Ress_Dst = imagecreatetruecolor($W,$H);
           break;
         case 'png':
           $Ress_Dst = imagecreatetruecolor($W,$H);
           // fond transparent (pour les png avec transparence)
           imagesavealpha($Ress_Dst, true);
           $trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
           imagefill($Ress_Dst, 0, 0, $trans_color);
           break;
         }
         // ---------------------
         // REDIMENSIONNEMENT (copie, redimensionne, re-echantillonne)
         imagecopyresampled($Ress_Dst, $Ress_Src, 0, 0, 0, 0, $W, $H, $W_Src, $H_Src); 
         // ---------------------
         // ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
         switch ($extension_Src) { 
         case 'jpg':
         case 'jpeg':
           imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
           break;
         case 'png':
           imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
           break;
         }
         // ------------------------
         // liberation des ressources-image
         imagedestroy ($Ress_Src);
         imagedestroy ($Ress_Dst);
      }
      // ------------------------
   }
 }
 // ---------------------------------------------------
 // retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
 if ($condition==1 && file_exists($rep_Dst.$img_Dst)) { return true; }
 else { return false; }
 // ---------------------------------------------------
};
?>

4. Redimensionnement physique "non-proportionnel"

Redimensionnement physique "non-proportionnel"
Original-paysage Original-portrait
Original-paysage-120x80non Original-portrait-120x80non

La fonction : fctdeformimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)

Redimensionnement physique "non-proportionnel" (les proportions de l'image NE sont PAS conservées : elle sera donc déformée)
3 options
A- "normal" : image finale à HAUTEUR ET LARGEUR fixes.
B- "hauteur" : image finale à HAUTEUR fixe (largeur de la source)
C- "largeur" : image finale à LARGEUR fixe (hauteur de la source)
NB :
Dans TOUS les cas : redimensionnement non-proportionnel de l'image.

Retourne la valeur :
- 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu,
- sinon rien (false)

Les paramètres :
- $W_fin : LARGEUR finale --> ou 0
- $H_fin : HAUTEUR finale --> ou 0
- $rep_Dst : répertoire de l'image de destination (déprotégé) --> ou ''
- $img_Dst : NOM de l'image de destination --> ou ''
- $rep_Src : répertoire de l'image source (déprotégé)
- $img_Src : NOM de l'image source

Les 3 options
A- si $W_fin != 0 et $H_fin != 0 --> à LARGEUR ET HAUTEUR fixes
B- si $H_fin != 0 et $W_fin == 0 --> à HAUTEUR fixe (largeur de la source)
C- si $W_fin == 0 et $H_fin != 0 --> à LARGEUR fixe (hauteur de la source)
NB :
$rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
- si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire que l'image Source)
- si $img_Dst = '' --> $img_Dst = $img_Src (même nom que l'image Source)
- si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image Source !

Extensions :
- acceptées (traitées ici) : .jpg , .jpeg , .png
- $img_Dst et $img_Src doivent avoir la même extension (même type mime) !
Pour ajouter d'autres extensions :
Voir bibliothèque GD - bibliothèque ImageMagick
Exemple :
Sélectionnez
<?php
$deformOK = fctdeformimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($deformOK == 1) { echo 'Redimensionnement OK !'; }
?>
fctdeformimage.php
Sélectionnez
<?php
// ---------------------------------------------------
// fonction de REDIMENSIONNEMENT physique "NON-PROPORTIONNEL" et Enregistrement
// ---------------------------------------------------
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------
// retourne : 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu, sinon rien (false)
// ---------------------// La FONCTION : fctdeformimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
// Les paramètres :
// - $W_fin : LARGEUR finale --> ou 0
// - $H_fin : HAUTEUR finale --> ou 0
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
// - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// ------------------------
// 3 options :
// A- si $W_fin != 0 et $H_fin != 0 : image finale a LARGEUR ET HAUTEUR fixes
// B- si $H_fin != 0 et $W_fin == 0 : image finale a HAUTEUR fixe (largeur auto)
// C- si $W_fin == 0 et $H_fin != 0 : image finale a LARGEUR fixe (hauteur auto)
// Dans TOUS les cas : redimensionnement non-proportionnel
// ------------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = ''   : $rep_Dst = $rep_Src (même répertoire que l'image Source)
// - si $img_Dst = '' : $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l'image source !
// ------------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ------------------------
// UTILISATION (exemple) :
// $deformOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if ($deformOK == 1) { echo 'Redimensionnement OK !';  }
// ---------------------------------------------------
function fctdeformimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
   // Si certains paramètres ont pour valeur '' :
   if ($rep_Dst == '') { $rep_Dst = $rep_Src; } // (même répertoire)
   if ($img_Dst == '') { $img_Dst = $img_Src; } // (même nom)
 // ------------------------
 // si le fichier existe dans le répertoire, on continue...
 if (file_exists($rep_Src.$img_Src) && ($W_fin!=0 || $H_fin!=0)) { 
   // ------------------------
   // extensions acceptées : 
	$extension_Allowed = 'jpg,jpeg,png';	// (sans espaces)
   // extension fichier Source
	$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
   // ------------------------
   // extension OK ? on continue ...
   if(in_array($extension_Src, explode(',', $extension_Allowed))) {
      // ------------------------
      // récupération des dimensions de l'image Src
      $img_size = getimagesize($rep_Src.$img_Src);
      $W_Src = $img_size[0]; // largeur
      $H_Src = $img_size[1]; // hauteur
      // ------------------------
      // condition de redimensionnement et dimensions de l'image finale
      // Dans TOUS les cas : redimensionnement non-proportionnel
      // ------------------------
      // A- LARGEUR ET HAUTEUR fixes
      if ($W_fin != 0 && $H_fin != 0) {
         $W = $W_fin;
         $H = $H_fin;
      }
      // ------------------------
      // B- HAUTEUR fixe
      if ($W_fin == 0 && $H_fin != 0) {
         $W = $W_Src;
         $H = $H_fin;
      }
      // ------------------------
      // C- LARGEUR fixe
      if ($W_fin != 0 && $H_fin == 0) {
         $W = $W_fin;
         $H = $H_Src;
      }
      // ------------------------------------------------
      // REDIMENSIONNEMENT
      // ------------------------------------------------
      // creation de la ressource-image "Src" en fonction de l extension
      switch($extension_Src) {
      case 'jpg':
      case 'jpeg':
        $Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
        break;
      case 'png':
        $Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
        break;
      }
      // ------------------------
      // creation d une ressource-image "Dst" aux dimensions finales
      // fond noir (par defaut)
      switch($extension_Src) {
      case 'jpg':
      case 'jpeg':
        $Ress_Dst = imagecreatetruecolor($W,$H);
        break;
      case 'png':
        $Ress_Dst = imagecreatetruecolor($W,$H);
        // fond transparent (pour les png avec transparence)
        imagesavealpha($Ress_Dst, true);
        $trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
        imagefill($Ress_Dst, 0, 0, $trans_color);
        break;
      }
      // ------------------------------------------------
      // REDIMENSIONNEMENT (copie, redimensionne, re-echantillonne)
      imagecopyresampled($Ress_Dst, $Ress_Src, 0, 0, 0, 0, $W, $H, $W_Src, $H_Src); 
      // ------------------------------------------------
      // ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
      switch ($extension_Src) { 
      case 'jpg':
      case 'jpeg':
        imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
        break;
      case 'png':
        imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
        break;
      }
      // ------------------------
      // liberation des ressources-image
      imagedestroy ($Ress_Src);
      imagedestroy ($Ress_Dst);
      // ------------------------
   }
 }
 // ---------------------------------------------------
 // retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
 if (file_exists($rep_Dst.$img_Dst)) { return true; }
 else { return false; }
 // ---------------------------------------------------
};
?>

5. Redimensionnement physique "crop centré"

Redimensionnement physique "crop centré"
Original-paysage Original-portrait
Original-paysage-crop Original-portrait-crop

La fonction : fctcropimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)

Redimensionnement physique "crop centré" (l'image est "coupée" aux dimensions voulues)
4 options
A- "normal" : crop "centré" aux dimensions indiquées
B- "hauteur" : crop "centré" de la hauteur indiquée (même largeur que la source)
C- "largeur" : crop "centré" de la largeur indiquée (même hauteur que la source)
D- "cas spécial" : crop "carré" à la plus petite dimension de l'image source

Retourne la valeur :
- 1 (vrai) si le redimensionnement et l'enregistrement ont bien eu lieu,
- sinon rien (false)

Les paramètres :
- $W_fin : LARGEUR finale --> ou 0
- $H_fin : HAUTEUR finale --> ou 0
- $rep_Dst : répertoire de l'image de destination (déprotégé) --> ou ''
- $img_Dst : NOM de l'image de destination --> ou ''
- $rep_Src : répertoire de l'image source (déprotégé)
- $img_Src : NOM de l'image source

Les 4 options
A- si $W_fin != 0 et $H_fin != 0 --> crop aux dimensions indiquées
B- si $W_fin == 0 et $H_fin != 0 --> crop en HAUTEUR (même largeur que la source)
C- si $W_fin != 0 et $H_fin == 0 --> crop en LARGEUR (même hauteur que la source)
D- si $W_fin == 0 et $H_fin == 0 --> (cas spécial) crop "carré" à la plus petite dimension de l'image source

NB :
$rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
- si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire)
- si $img_Dst = '' --> $img_Dst = $img_Src (même nom)
- si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image source !

Extensions :
- acceptées (traitées ici) : .jpg , .jpeg , .png
- $img_Dst et $img_Src doivent avoir la même extension (même type mime) !
Pour ajouter d'autres extensions :
Voir bibliothèque GD - bibliothèque ImageMagick
Exemple :
Sélectionnez
<?php
$cropOK = fctcropimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
if ($cropOK == 1) { echo 'Crop centré OK !'; }
?>
ASTUCE : Picto toujours carré
Sélectionnez
<?php
$redim = fctcropimage(0,0,$repDest,$imageDest,$repSource,$imageSource);
$redim = fctredimimage(100,0,'','',$repDest,$imageDest);
if ($redim==true) { echo 'picto carré créé !'; }
?>
Picto toujours carré
Original-paysage-carre Original-portrait-carre
fctcropimage.php
Sélectionnez
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction de REDIMENSIONNEMENT physique "CROP CENTRE" et Enregistrement
// ---------------------------------------------------
// retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
// ---------------------
// La FONCTION : fctcropimage ($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
// Les paramètres :
// - $W_fin : LARGEUR finale --> ou 0
// - $H_fin : HAUTEUR finale --> ou 0
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou ''
// - $img_Dst : NOM de l'image de Destination --> ou ''
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// ---------------------
// 4 options :
// A- si $W_fin!=0 et $H_fin!=0 : crop aux dimensions indiquées
// B- si $W_fin==0 et $H_fin!=0 : crop en HAUTEUR (meme largeur que la source)
// C- si $W_fin!=0 et $H_fin==0 : crop en LARGEUR (meme hauteur que la source)
// D- si $W_fin==0 et $H_fin==0 : (special) crop "carre" a la plus petite dimension de l'image source
// ---------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire que le repertoire Source)
// - si $img_Dst = '' --> $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst = '' ET $img_Dst = '' --> on ecrase (remplace) l'image source ($img_Src) !
// ---------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour Ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ---------------------
// UTILISATION (exemple) :
// $cropOK = fctcropimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
// if ($cropOK==true) { echo 'Crop centré OK !';  }
// ---------------------
function fctcropimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src) {
 // ---------------------
 $condition = 0;
 // Si certains paramètres ont pour valeur '' :
   if ($rep_Dst=='') { $rep_Dst = $rep_Src; } // (même répertoire)
   if ($img_Dst=='') { $img_Dst = $img_Src; } // (même nom)
 // ---------------------
 // si le fichier existe dans le répertoire, on continue...
 if (file_exists($rep_Src.$img_Src)) { 
   // ----------------------
   // extensions acceptées : 
	$extension_Allowed = 'jpg,jpeg,png';	// (sans espaces)
   // extension fichier Source
	$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
   // ----------------------
   // extension OK ? on continue ...
   if(in_array($extension_Src, explode(',', $extension_Allowed))) {
      // ------------------------
      // récupération des dimensions de l'image Source
      $img_size = getimagesize($rep_Src.$img_Src);
      $W_Src = $img_size[0]; // largeur
      $H_Src = $img_size[1]; // hauteur
      // ------------------------------------------------
      // condition de crop et dimensions de l'image finale
      // ------------------------------------------------
      // A- crop aux dimensions indiquées
      if ($W_fin!=0 && $H_fin!=0) {
         $W = $W_fin;
         $H = $H_fin;
      }      // ------------------------
      // B- crop en HAUTEUR (meme largeur que la source)
      if ($W_fin==0 && $H_fin!=0) {
         $H = $H_fin;
         $W = $W_Src;
      }
      // ------------------------
      // C- crop en LARGEUR (meme hauteur que la source)
      if ($W_fin!=0 && $H_fin==0) {
         $W = $W_fin;
         $H = $H_Src;         
      }
      // D- crop "carre" a la plus petite dimension de l'image source
      if ($W_fin==0 && $H_fin==0) {
        if ($W_Src >= $H_Src) {
         $W = $H_Src;
         $H = $H_Src;
        } else {
         $W = $W_Src;
         $H = $W_Src;
        }   
      }
      // ------------------------
      // creation de la ressource-image "Src" en fonction de l extension
      switch($extension_Src) {
      case 'jpg':
      case 'jpeg':
         $Ress_Src = imagecreatefromjpeg($rep_Src.$img_Src);
         break;
      case 'png':
         $Ress_Src = imagecreatefrompng($rep_Src.$img_Src);
         break;
      }
      // ---------------------
      // creation d une ressource-image "Dst" aux dimensions finales
      // fond noir (par defaut)
      switch($extension_Src) {
      case 'jpg':
      case 'jpeg':
         $Ress_Dst = imagecreatetruecolor($W,$H);
         // fond blanc
         $blanc = imagecolorallocate ($Ress_Dst, 255, 255, 255);
         imagefill ($Ress_Dst, 0, 0, $blanc);
         break;
      case 'png':
         $Ress_Dst = imagecreatetruecolor($W,$H);
         // fond transparent (pour les png avec transparence)
         imagesavealpha($Ress_Dst, true);
         $trans_color = imagecolorallocatealpha($Ress_Dst, 0, 0, 0, 127);
         imagefill($Ress_Dst, 0, 0, $trans_color);
         break;
      }
      // ------------------------
      // CENTRAGE du crop
      // coordonnees du point d origine Scr : $X_Src, $Y_Src
      // coordonnees du point d origine Dst : $X_Dst, $Y_Dst
      // dimensions de la portion copiee : $W_copy, $H_copy
      // ------------------------
      // CENTRAGE en largeur
      if ($W_fin==0) {
         if ($H_fin==0 && $W_Src < $H_Src) {
            $X_Src = 0;
            $X_Dst = 0;
            $W_copy = $W_Src;
         } else {
            $X_Src = 0;
            $X_Dst = ($W - $W_Src) /2;
            $W_copy = $W_Src;
         }
      } else {
         if ($W_Src > $W) {
            $X_Src = ($W_Src - $W) /2;
            $X_Dst = 0;
            $W_copy = $W;
         } else {
            $X_Src = 0;
            $X_Dst = ($W - $W_Src) /2;
            $W_copy = $W_Src;
         }
      }
      // ------------------------
      // CENTRAGE en hauteur
      if ($H_fin==0) {
         if ($W_fin==0 && $H_Src < $W_Src) {
            $Y_Src = 0;
            $Y_Dst = 0;
            $H_copy = $H_Src;
         } else {
            $Y_Src = 0;
            $Y_Dst = ($H - $H_Src) /2;
            $H_copy = $H_Src;
         }
      } else {
         if ($H_Src > $H) {
            $Y_Src = ($H_Src - $H) /2;
            $Y_Dst = 0;
            $H_copy = $H;
         } else {
            $Y_Src = 0;
            $Y_Dst = ($H - $H_Src) /2;
            $H_copy = $H_Src;
         }
      }
      // ------------------------------------------------
      // CROP par copie de la portion d image selectionnee
		imagecopyresampled($Ress_Dst,$Ress_Src,$X_Dst,$Y_Dst,$X_Src,$Y_Src,$W_copy,$H_copy,$W_copy,$H_copy);
      // ------------------------------------------------
      // ENREGISTREMENT dans le repertoire (avec la fonction appropriee)
      switch ($extension_Src) { 
      case 'jpg':
      case 'jpeg':
         imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
         break;
      case 'png':
         imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
         break;
      }
      // ---------------------
      // liberation des ressources-image
      imagedestroy ($Ress_Src);
      imagedestroy ($Ress_Dst);
      // ---------------------
      $condition = 1;
   }
 }
 // ---------------------------------------------------
 // retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
 if ($condition==1 && file_exists($rep_Dst.$img_Dst)) { return true; }
 else { return false; }
 // ---------------------------------------------------
};
?>

6. "Signature" de l'image

"Signature" de l'image
Original-signature-HG Original-signature-HD
Original-signature-BG Original-signature-BD
Original-signature-HC Original-signature-BC

La fonction : fcttexteimage ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position)

"Signature" de l'image (ajout d'un texte à l'image : copyright, date, ou légende de l'image)
Un petit "plus" !

Retourne la valeur :
- 1 (vrai) si le texte a bien été ajouté,
- sinon rien (false)

Les paramètres :
- $chaine : TEXTE à ajouter
- $rep_Dst : répertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
- $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
- $rep_Src : répertoire de l'image Source (déprotégé)
- $img_Src : NOM de l'image Source
- $position : position du texte sur l'image
NB :
ATTENTION : si le texte est TROP long, il risque d'être tronqué ! (Privilégiez donc les textes courts)

Positionnement du texte sur l'image (valeurs possibles) :
- $position = 'HG' --> en Haut à Gauche (valeur par défaut)
- $position = 'HD' --> en Haut à Droite
- $position = 'HC' --> en Haut au Centre
- $position = 'BG' --> en Bas à Gauche
- $position = 'BD' --> en Bas à Droite
- $position = 'BC' --> en Bas au Centre

NB :
$rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
- si $rep_Dst = '' --> $rep_Dst = $rep_Src (même répertoire)
- si $img_Dst = '' --> $img_Dst = $img_Src (même nom)
- si $rep_Dst='' ET $img_Dst='' --> on écrase (remplace) l'image source !

Extensions :
- acceptées (traitées ici) : .jpg , .jpeg , .png
- $img_Dst et $img_Src doivent avoir la même extension (même type mime) !
Pour ajouter d'autres extensions :
Voir bibliothèque GD - bibliothèque ImageMagick
Exemple (copyright, date, ou légende de l'image) :
Sélectionnez
<?php
$texteOK = fcttexteimage('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
if ($texteOK == 1) { echo 'Ajout du texte OK !';  }
?>
fcttexteimage.php
Sélectionnez
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// Fonction d AJOUT DE TEXTE a une image et Enregistrement
// ---------------------------------------------------
// retourne : true si l ajout de texte a bien été ajouté, sinon false
// ---------------------
// La FONCTION : fcttexteimage ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position)
// Les paramètres :
// - $chaine : TEXTE a Ajouter
// - $rep_Dst : repertoire de l'image de Destination (déprotégé) --> ou '' (même répertoire)
// - $img_Dst : NOM de l'image de Destination --> ou '' (même nom que l'image Source)
// - $rep_Src : repertoire de l'image Source (déprotégé)
// - $img_Src : NOM de l'image Source
// - $position : position du texte sur l'image
// ---------------------
// ATTENTION : si le texte est TROP long, il risque d'être tronqué !
// ---------------------
// Position du texte sur l'image (valeurs possibles) :
// $position = 'HG' --> en Haut a Gauche (valeur par defaut)
// $position = 'HD' --> en Haut a Droite
// $position = 'HC' --> en Haut au Centre
// $position = 'BG' --> en Bas a Gauche
// $position = 'BD' --> en Bas a Droite
// $position = 'BC' --> en Bas au Centre
// ---------------------
// $rep_Dst : il faut s'assurer que les droits en écriture ont été donnés au dossier (chmod)
// - si $rep_Dst = ''   : $rep_Dst = $rep_Src (même répertoire que l'image Source)
// - si $img_Dst = '' : $img_Dst = $img_Src (même nom que l'image Source)
// - si $rep_Dst='' ET $img_Dst='' : on ecrase (remplace) l'image source !
// ---------------------
// NB : $img_Dst et $img_Src doivent avoir la meme extension (meme type mime) !
// Extensions acceptées (traitees ici) : .jpg , .jpeg , .png
// Pour Ajouter d autres extensions : voir la bibliotheque GD ou ImageMagick
// (GD) NE fonctionne PAS avec les GIF ANIMES ou a fond transparent !
// ---------------------
// UTILISATION (exemple copyright, ou legende de l'image) :
// $texteOK = fcttexteimage('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
// if ($texteOK==true) { echo 'Ajout du texte OK !';  }
// ---------------------
function fcttexteimage($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position) {
 // ---------------------
   $condition = 0;
   $position = strtoupper($position); // on met en majuscule (par defaut)
 // Si certains paramètres ont pour valeur '' :
   if ($rep_Dst=='') { $rep_Dst = $rep_Src; } // (même répertoire)
   if ($img_Dst=='') { $img_Dst = $img_Src; } // (même nom)
   if ($position=='') { $position = 'BG'; } // en Bas A Gauche (valeur par defaut)
 // ---------------------
 // si le fichier existe dans le répertoire, on continue...
 if (file_exists($rep_Src.$img_Src) && $chaine!='') { 
   // ----------------------
   // extensions acceptées : 
	$extension_Allowed = 'jpg,jpeg,png';	// (sans espaces)
   // extension fichier Source
	$extension_Src = strtolower(pathinfo($img_Src,PATHINFO_EXTENSION));
   // ----------------------
   // extension OK ? on continue ...
   if(in_array($extension_Src, explode(',', $extension_Allowed))) {
      // ---------------------
      // récupération des dimensions de l'image Src
      $img_size = getimagesize($rep_Src.$img_Src);
      $W_Src = $img_size[0]; // largeur
      $H_Src = $img_size[1]; // hauteur
      // ---------------------
      // creation de la ressource-image "Dst" en fonction de l extension
      // (a partir de l'image source)
      switch($extension_Src) {
      case 'jpg':
      case 'jpeg':
        $Ress_Dst = imagecreatefromjpeg($rep_Src.$img_Src);
        break;
      case 'png':
        $Ress_Dst = imagecreatefrompng($rep_Src.$img_Src);
        break;
      }
      // ------------------------------------------------
      // creation de l'image TEXTE
      // ------------------------------------------------
      // dimension de l'image "Txt" en fonction :
      // - de la longueur du texte a afficher
      // - des dimensions des caracteres (7x15 pixels par caractère)
      // ATTENTION : si le texte est TROP long, il risque d'être tronqué !
      $W = strlen($chaine) * 7;
      if ($W > $W_Src) { $W = $W_Src; }
      $H = 15; // 15 pixels de haut (par defaut)
      // ---------------------
      // creation de la ressource-image "Txt" (en fonction de l extension)
      switch($extension_Src) {
      case 'jpg':
      case 'jpeg':
      case 'png':
        $Ress_Txt = imagecreatetruecolor($W,$H);
        // Couleur du Fond : blanc
        $blanc = imagecolorallocate ($Ress_Txt, 255, 255, 255);
        imagefill ($Ress_Txt, 0, 0, $blanc);
        // Couleur du Texte : noir
        $textcolor = imagecolorallocate($Ress_Txt, 0, 0, 0);
        // Ecriture du TEXTE
        imagestring($Ress_Txt, 3, 0, 0, $chaine, $textcolor);
        break;
      }
      // ------------------------------------------------
      // positionnement du TEXTE sur l'image
      // ------------------------------------------------
      if ($position=='HG') {
         $X_Dest = 0;
         $Y_Dest = 0;
      }
      if ($position=='HD') {
         $X_Dest = $W_Src - $W;
         $Y_Dest = 0;
      }
      if ($position=='HC') {
         $X_Dest = ($W_Src - $W)/2;
         $Y_Dest = 0;
      }
      if ($position=='BG') {
         $X_Dest = 0;
         $Y_Dest = $H_Src - $H;
      }
      if ($position=='BD') {
         $X_Dest = $W_Src - $W;
         $Y_Dest = $H_Src - $H;
      }
      if ($position=='BC') {
         $X_Dest = ($W_Src - $W)/2;
         $Y_Dest = $H_Src - $H;
      }
      // ------------------------------------------------
      // copie par fusion de l'image "Txt" sur l'image "Dst"
      // (avec transparence de 50%)
      imagecopymerge ($Ress_Dst, $Ress_Txt, $X_Dest, $Y_Dest, 0, 0, $W, $H, 50);
      // ------------------------------------------------
      // ENREGISTREMENT dans le repertoire (en fonction de l extension)
      switch ($extension_Src) { 
      case 'jpg':
      case 'jpeg':
        imagejpeg ($Ress_Dst, $rep_Dst.$img_Dst);
        break;
      case 'png':
        imagepng ($Ress_Dst, $rep_Dst.$img_Dst);
        break;
      }
      // ---------------------
      // liberation des ressources-image
      imagedestroy ($Ress_Txt);
      imagedestroy ($Ress_Dst);
      // ---------------------
      $condition = 1;
   }
 }
 // ---------------------------------------------------
 // retourne : true si le redimensionnement et l'enregistrement ont bien eu lieu, sinon false
 if ($condition==1 && file_exists($rep_Dst.$img_Dst)) { return true; }
 else { return false; }
 // ---------------------------------------------------
};
?>

7. Utilisation

7-A. Récapitulatif

Redimensionnement à l'affichage
Sélectionnez
Fonction : fctaffichimage($img_Src, $W_max, $H_max)
Exemple :
	<img alt="" src="repimg/monimage.jpg" <?php fctaffichimage('repimg/monimage.jpg', 150, 100) ?> />
	
Redimensionnement physique proportionnel
Sélectionnez
Fonction : fctredimimage($W_max, $H_max, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php
	$redimOK = fctredimimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
	if ($redimOK == 1) { echo 'Redimensionnement OK !'; }
?>
Redimensionnement physique non-proportionnel
Sélectionnez
Fonction : fctdeformimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php	$deformOK = fctdeformimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
		  if ($deformOK == 1) { echo 'Redimensionnement OK !'; } ?>
Redimensionnement physique crop centré
Sélectionnez
Fonction : fctcropimage($W_fin, $H_fin, $rep_Dst, $img_Dst, $rep_Src, $img_Src)
Exemple :
<?php
	$cropOK = fctcropimage(120,80,'reppicto/','monpicto.jpg','repimage/','monimage.jpg');
	if ($cropOK == 1) { echo 'Crop centré OK !'; }
?>
Astuce - picto toujours carré avec crop
Sélectionnez
<?php
	$redim = fctcropimage(0,0,$repDest,$imageDest,$repSource,$imageSource);
	$redim = fctredimimage(100,0,'','',$repDest,$imageDest);
	if ($redim==true) { echo 'picto carré créé !'; }
?>
Astuce - picto toujours carré déformé
Sélectionnez
<?php
	$redim = fctdeformimage(100,100,$repDest,$imageDest,$repSource,$imageSource);
	if ($redim==true) { echo 'picto carré créé !'; }
?>
Signature d'une image
Sélectionnez
Fonction : fcttexteimage ($chaine, $rep_Dst, $img_Dst, $rep_Src, $img_Src, $position)
Exemple (copyright, date, ou légende de l'image) :
<?php
	$texteOK = fcttexteimage('copyright : MOI','reppicto/','monpicto.jpg','repimage/','monimage.jpg','BG');
	if ($texteOK == 1) { echo 'Ajout du texte OK !';  }  ?>

7-B. Utilisation avec base de données

Pour voir un exemple fonctionnel complet, voir : PHP - Système de Gestion-Affichage de Nouvelles (avec photo et fichier joint)

Aperçu du fichier de traitement :

A/ RECUPERATION DES DONNEES DU FORMULAIRE

B/ Gestion des photos supprimées
 - Suppression de l'ancienne Photo
 - Suppression dans la base de donnees par UPDATE

C/ VERIFICATION / TRAITEMENT de la photo si uploadée
 - extension du fichier uploadé
 - Type MIME réel du fichier (important : évite les fichiers NON valides, dont l'extension a été renommée)

D/ GESTION DES ERREURS
 - on vérifie les RESTRICTIONS sur les fichiers
 - on vérifie la TAILLE MAXI
 - on vérifie l'EXTENSION
 - on vérifie le TYPE MIME

E/ si pas d'erreur : TRAITEMENT
 - enregistement de la PHOTO sous forme id_nom-image(.jpg, ...).
NB : id etant unique (auto-increment), cela rend le nom de la photo unique.  - enregistrement de la photo dans le dossier
 - REDIMENSIONNEMENT et SAUVEGARDE de la PHOTO (si nécessaire)
 - SUPPRESSION des ANCIENNES PHOTOS (si necessaire) dans le dossier

news_traiter_photo.php
Sélectionnez
<?php
// © Jérome Réaux : http://j-reaux.developpez.com - http://www.jerome-reaux-creations.fr
// ---------------------------------------------------
// ADMIN NEWS : TRAITEMENT des photos
// ---------------------------------------------------
// RECUPERATION DES DONNEES DU FORMULAIRE
// photo
	$newsPhotoAvant 		= (isset($_POST['newsPhotoAvant']))? 		formatage_from_post($_POST['newsPhotoAvant']) : '';
	$newsPhotoDelete 		= (isset($_POST['newsPhotoDelete']))? 		formatage_from_post($_POST['newsPhotoDelete']) : '';
	$newsPhotoLargeur 		= (isset($_POST['newsPhotoLargeur']))? 		formatage_from_post($_POST['newsPhotoLargeur']) : '';

// -----------------
// Gestion des photos supprimees
if ($newsPhotoAvant!='' && $newsPhotoDelete=='ON')
{
	// Suppression de l'ancienne Photo
	if(file_exists('../../'.REP_NEWS_PHOTO.$newsPhotoAvant)) {
		unlink('../../'.REP_NEWS_PHOTO.$newsPhotoAvant);
	}
	// -----------------
	// Suppression dans la base de donnees par UPDATE
	$update_query 			= "UPDATE ".$NEWS_TABLE." ".
							" SET news_photo 	= '' ".
							" WHERE news_id 	= :newsId;";
  try {
	$pdo_update 			= $pdo->prepare($update_query);
	$pdo_update->bindValue(':newsId', 		$newsId,		PDO::PARAM_INT);
	$pdo_update->execute();
  } catch (PDOException $e) { echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
	// -----------------
}

// ----------------------------------
// VERIFICATION / TRAITEMENT de la photo si uploadee
// ----------------------------------
$msgErreurPhoto 			= ''; 	// message d erreur
$traiterPhotoOK 			= true; // (par defaut)

if(isset($_FILES['newsPhoto']) && $_FILES['newsPhoto']['size']>0)
{
	// -------------------------------------
	// extension du fichier uploadé (en minuscule)
	$file_Extension 		= strtolower(pathinfo($_FILES['newsPhoto']['name'],PATHINFO_EXTENSION));

	// Type MIME réel du fichier (important : évite les fichiers NON valides, dont l'extension a été renommée)
//	$finfo 					= new finfo(FILEINFO_MIME_TYPE, NULL); // Retourne le type mime
//	$file_MimeType 			= $finfo->file($_FILES['newsPhoto']['tmp_name']);

	// (alternative, si la CLASS finfo n'est pas supportée)
	$finfo 					= finfo_open(FILEINFO_MIME_TYPE); // Retourne le type mime à la extension mimetype
	$file_MimeType 			= finfo_file($finfo, $_FILES['newsPhoto']['tmp_name']);
	finfo_close($finfo);

	// -------------------------------------
	// GESTION DES ERREURS
	// -------------------------------------
	// on vérifie les RESTRICTIONS sur les fichiers
	if (UPLOAD_ERR_OK<>0 && UPLOAD_ERR_FORM_SIZE==2) {
		$msgErreurPhoto 	.= 'Taille de fichier trop important ('.FILE_SIZEMAX_PHOTO.' octets)<br />';
		$traiterPhotoOK 	= false;
	}
	// -----------------
	// on vérifie la TAILLE MAXI
	elseif ($_FILES['newsPhoto']['size'] > FILE_SIZEMAX_PHOTO) {
		$msgErreurPhoto 	.= 'Taille de fichier supérieure à la taille maxi autorisée ('.FILE_SIZEMAX_PHOTO.' octets)<br />';
		$traiterPhotoOK 	= false;
	}
	// -----------------
	// on vérifie l'EXTENSION
	elseif(!in_array($file_Extension, explode(',', constant('FILE_EXTENSION_PHOTO')))) {
		$msgErreurPhoto 	.= 'L\'extension ne correspond pas (Extensions acceptées  : <b>'.constant('FILE_EXTENSION_PHOTO').'</b>)<br />';
		if(in_array($file_MimeType, explode(',', constant('FILE_MIMETYPE_PHOTO')))) {
		  $msgErreurPhoto 	.= '<b>Attention</b> : Ce fichier est peut-être corrompu !<br />';
		  $msgErreurPhoto 	.= 'L\'extension ne correspond pas au type MIME !<br />';
		}
		$traiterPhotoOK 	= false;
	}
	// -----------------
	// on vérifie le TYPE MIME
	elseif(!in_array($file_MimeType, explode(',', constant('FILE_MIMETYPE_PHOTO')))) {
		$msgErreurPhoto 	.= 'Le type MIME ne correspond pas (Extensions acceptées  : <b>'.constant('FILE_EXTENSION_PHOTO').'</b>)<br />';
		if(in_array($file_Extension, explode(',', constant('FILE_EXTENSION_PHOTO')))) {
		  $msgErreurPhoto 	.= '<b>Attention</b> : Ce fichier est peut-être corrompu !<br />';
		  $msgErreurPhoto 	.= 'L\'extension ne correspond pas au type MIME !<br />';
		}
		$traiterPhotoOK 	= false;
	}
	// -----------------
	if ($traiterPhotoOK===false) {
		$msgErreurPhoto 	= '<b>Erreur (Photo)</b> :<br />'.$msgErreurPhoto.'Impossible d\'enregistrer le fichier.';
	}
	// -------------------------------------
	// si pas d'erreur : TRAITEMENT
	// -------------------------------------
	if ($traiterPhotoOK===true)
	{
		// --------------------
		// enregistement de la PHOTO sous forme id_nom-image(.jpg, ...)
		// NB : id etant unique (auto-increment), cela rend le nom de la photo unique
		$file_Upload 		= $newsId.'_'.$_FILES['newsPhoto']['name'];
		$file_Upload 		= formatage_nom_fichier($file_Upload); // remplacement des caracteres speciaux + tout en minuscules
		$file_Upload 		= str_replace('.jpeg','.jpg',$file_Upload); // on remplace aussi .jpeg par .jpg
		// --------------------
		// enregistrement de la photo dans le dossier
		$temp = $_FILES['newsPhoto']['tmp_name'];
		move_uploaded_file($temp, '../../'.REP_NEWS_PHOTO.$file_Upload);
		// --------------------
		// REDIMENSIONNEMENT et SAUVEGARDE de la PHOTO (si necessaire)
		// ecraser (remplacer) la photo (meme rep, meme nom)
		$redimPHOTOOK 		= fctredimimage($newsPhotoLargeur,0,'','','../../'.REP_NEWS_PHOTO,$file_Upload);
		// --------------------
		// SUPPRESSION des ANCIENNES PHOTOS (si necessaire) dans le dossier
		if ($newsPhotoAvant!='' && $newsPhotoAvant!=$file_Upload)
		{
			if(file_exists('../../'.REP_NEWS_PHOTO.$newsPhotoAvant)) {
				unlink('../../'.REP_NEWS_PHOTO.$newsPhotoAvant);
			}
		}
		// -----------------
		// enregistrement du NOM dans la base de donnees par UPDATE
		$update_query 		= "UPDATE ".$NEWS_TABLE." SET ".
							" news_photo 			= :file_Upload, ".
							" news_photo_largeur	= :newsPhotoLargeur ".
							" WHERE news_id 		= :newsId;";
	  try {
		$pdo_update 		= $pdo->prepare($update_query);
		$pdo_update->bindValue(':file_Upload', 		$file_Upload,		PDO::PARAM_STR);
		$pdo_update->bindValue(':newsPhotoLargeur', $newsPhotoLargeur,	PDO::PARAM_STR);
		$pdo_update->bindValue(':newsId', 			$newsId,			PDO::PARAM_INT);
		$pdo_update->execute();
	  } catch (PDOException $e) { echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
		// -----------------
	}

} // fin TRAITEMENT PHOTO
// ---------------------------------------------------

7-C. Utilisation dans un dossier

Hypothèse :
Un dossier "repPHOTOS" contenant déjà des images.
Vous souhaitez créer des images de prévisualisation (pictos) (ex. 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)

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.

NB :
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.
("forcer" le redimensionnement : $condition=1)

MONDOSSIER-REDIM.php
Sélectionnez
<?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)
// ------------------------------
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr">
<head>
	 <meta http-equiv="content-type" content="text/html; charset=utf-8" />
	 <title>MONDOSSIER-REDIM.php</title>
</head>
<body>

<?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);
		// ------------------------------
		// (facultatif) Affichage de confirmation d'écriture
		if ($RedimOK == 1 ) {
			echo '<p>Picto créé : '.$rep_Dst.$img_Dst.'...</p>';
		}
	} // fin si existe
} // fin while
// ------------------------------
// Fermeture du dossier
closedir($ouvredir);
?>
<p>Les pictos se trouvent dans le dossier <?php echo $rep_Dst; ?></p>

</body>
</html>

8. Conclusion

8-A. Conclusion

Les fonctions proposées ici devraient répondre à la plupart des cas de redimensionnement !

8-B. Remerciements

Un grand remerciement à tous pour vos conseils :
yogui, kerod, sayrus, loka,

Special Thanks à ma chienne Candy, qui a posé pour les photos !

Toutes remarques, corrections, ajouts, permettant d'améliorer ou d'étoffer ce tutoriel seront les bienvenus. 5 commentaires Donner une note à l'article (5)