Une fonction pour crééer automatiquement des vignettes d’images à taille choisie

Ce script permet de créer et de stocker automatiquement des images à taille choise à partir d’une image originale. L’usage principal est de pouvoir générer des vignettes pour une galerie de type "Fancybox", mais d’autres usages sont possibles, comme la réduction d’une image trop grande pour son affichage optimisé dans une page.

1/14 | Suivant

Le script contient une fonction qui est appelée en spécifiant
- l’adresse de l’image originale
- la taille en largeur et hauteur de l’image finale désirée
- le type de procédure : sans recadrage (l’image reste complète, et donc juste réduite) ou avec recadrage (l’mage finale sera exactement au format demandé, mais une partie de l’image originale sera perdue dans la version fabriquée)

La fonction renvoie l’adresse de l’image calculée sauf si l’image demandée est plus grande que l’image originale (dans ce cas, l’adresse de l’original est renvoyée).

La fonction stocke crée un dossier dont le nom par défaut est "vignettes", si ce dossier n’existe pas encore. Elle va ensuite vérifier qu’il n’y a pas dans ce dossier une image qui correspond à la demande, qui aurait été fabriquée auparavant. Ceci permet de ne pas recréer les images à chaque chargement. Si c’est le cas, elle renvoie simplement le nom de cette image. Si l’image correspondante n’existe pas encore, elle crée cette image en ajoutant au nom original les infos de taille, de telle manière à posséder un nom unique, puis la stocke dans le dossier.

La fonction s’utilise comme suit :

echo "<img src='".donne_lien("image.jpg",600,600,true)."'>";

Le résultat est l’adresse "vignettes/image.jpg_600_600_c.jpg".

Voici les deux images qui ont servi de test :
L’original (1500 X 1057 px)

Le résultat (600 X 600 px)

Le script est composé de trois fonctions :
- La fonction principale, décrite plus haut
- la fonction de traitement d’image
- une petite fonction faite pour isoler le nom du fichier dans un url (exemple : "image/monimage.gif" devient "monimage.gif")

Le code est commenté pour plus de clarté.

<?php
// donne lien : reçoit une adresse de fichier et une taille, verifie si une vignette a cette taille existe et produit une version de cette image. le cas échaant renvoie cette adresse
// exemple : echo donne_lien("image.jpg",600,600,true);
// "image.jpg" : le lien relatif de l'image
// 600,600 : taille en largeur et hauteur de l'image
// true : l'image fera cette taille, obtenue en coupant dans l'image mais en exploitant le maximum de sa surface
// false : coupe en gardant les proportions de l'image mais en exploitant au mieux la taille donnée.

function donne_lien($file,$l_vignette=600,$h_vignette=600,$crop=true){
   // creer le dossier pour les images petites
   $dossier_vignettes="vignettes/";
   
   
   if(!is_dir($dossier_vignettes)){
       mkdir($dossier_vignettes, 0777, true);
   }
   if(!is_file($file)){ $file="img-default/default.jpg"; }
   $ext_image=array('jpg','png','gif');
   $ext=strtolower(substr(strrchr($file,"."),1));
   if($crop){ $c="c"; } else { $c="p"; }
   
   $add="_".$l_vignette."_".$h_vignette."_".$c;
   $nom=fichier_seul($file);
   $full_nom=$dossier_vignettes.$nom.$add.".".$ext;

   // - - - image : traitement des icones
   if(in_array($ext,$ext_image)){
       // charger l'image brute
       // vérifier que l'image existe
       // sinon la créer
       if (!file_exists($full_nom)) {
           if(image_resize($file, $full_nom, $l_vignette, $h_vignette, $crop)){
               return $full_nom."?".filectime($full_nom);
           } else {
               return $file;
           }
       } else {
           return $full_nom."?".filectime($full_nom);  
       }

   } else {
       return "img_sys/error.jpg";  
   }

}
// a partir d'un lien relatif, renvoie le nom du fichier seul
// exemple : "image/monimage.gif" devient "monimage.gif"
function fichier_seul($file){
   $file = preg_replace('/.*\//i', '', $file);
   return $file;       
}

// image_resize : crée une image au format demandé avec crop ou proportion
// $src : nom de l'image (lien relatif)
// $dst : nom de l'image créée (lein relatif)
// $width : la largeur demandée
// $height : la hauteur demandée
// $crop : provoque le recadrage (1) ou la réduction en proportion (0)
function image_resize($src, $dst, $width=500, $height=400, $crop=false){
   ini_set('memory_limit', '256M');
   if(!list($w, $h) = getimagesize($src)) {
       echo "image does not exists";
       return false;
   }

   $type = strtolower(substr(strrchr($src,"."),1));
   if($type == 'jpeg') $type = 'jpg';
   switch($type){
       case 'gif': $img = imagecreatefromgif($src); break;
       case 'jpg': $img = imagecreatefromjpeg($src); break;
       case 'png': $img = imagecreatefrompng($src); break;
       default : echo "image does not exists"; return false;
   }

   // resize
   if($crop){
       if($w < $width or $h < $height){
           return false;
       };

       $ratio = max($width/$w, $height/$h);
       $y= ($h - $height / $ratio) /2;
       $x = ($w - $width / $ratio) / 2;
       $h = $height / $ratio;
       $w = $width / $ratio;

   } else {
       
       if($w < $width and $h < $height) {
           return false;
       }

       $ratio = min($width/$w, $height/$h);
       $width = $w * $ratio;
       $height = $h * $ratio;
       $x = 0;
       $y = 0;
   }

   $new = imagecreatetruecolor($width, $height);

   // preserve transparency
   if($type == "gif" or $type == "png"){
       imagecolortransparent($new, imagecolorallocatealpha($new, 0, 0, 0, 127));
       imagealphablending($new, false);
       imagesavealpha($new, true);
   }
   imagecopyresampled($new, $img, 0, 0, $x, $y, $width, $height, $w, $h);
   switch($type){
       case 'gif': imagegif($new, $dst); break;
       case 'jpg': imagejpeg($new, $dst); break;
       case 'png': imagepng($new, $dst); break;
   }
   return true;
}
?>