Fonction vignettes

Ceci est une ARCHIVE, peut-être périmée. Vérifiez bien les compatibilités !

Lors de l’élaboration d’un catalogue, ou les logos d’articles servent à présenter les produits en images, il m’a fallut trouver le moyen d’alléger mes pages catalogue.

NOTE DES ADMINS
Spip 1.8 permet d’utiliser le filtre reduire_image qui a exactement le même effet que celui proposé ici (voir mieux ;-) )
Toutefois des utilisateurs de spip 1.7 peuvent être intéressés par le filtre proposé dans cet article.

En effet, pour voir correctement les détails d’images, les fichiers « logos » sont très « lourd », alors quand on charge 20 ou 30 photos, c’est la galère en 28k !

La solution pour aléger mes pages était de créer des vignettes de mes logos, j’ai donc décidé d’adapter le filtre Redimensionner les images d’un article à la volée à mes besoins :

copiez ce code dans « mes_fonctions.php »

/*Filter Name: vignettes     [(#LOGO_ARTICLE|fichier|vignettes{100,center})]
  Author: Renato Formato
  Modifiée par : Stan LEDEWYN        [retourne la balise img modifiée]
  mail: renatoformato@virgilio.it
  Date: 6/6/2004
  License: GPL
  URL: www.spip-contrib.net?article.php3?id_article=550
      !!!!ne pas oublier d'activer la fonction vignette dans la
      partie administrative de spip
                                                           */

function vignettes($texte, $taille ,$align, $axes="both") {
  $image="IMG/$texte"; //on construit l'adresse de l'image

  //a week in seconds
  $maint_delay = 3600*24*7;
  //retrieve last mainteinance time
  $last_maint_date=@filemtime("IMG/last_maint.txt");
  //never done mainteinance. Create last_maint file
  if (!$last_maint_date) {
    $handle=fopen("IMG/last_maint.txt","w");
    fclose($handle);
    $last_maint_date=@filemtime("IMG/last_maint.txt");
  }
  //create resized images
 $texte=reduire_image_ex($image,$taille,$axes,$last_maint_date,$maint_delay,$align);

  //check last mainteinance+delay<now
  if (($last_maint_date+$maint_delay)<time()) {
    //do maint
    //clear file cache to avoid deleting just touched files
    clearstatcache();
    do_maint("IMG/resized",$last_maint_date);
    touch("IMG/last_maint.txt");
  }
  return $texte;
}

function do_maint($maint_folder,$last_maint_date) {
  //open dir
  if ($handle=@opendir($maint_folder)) {
    //enumerate files in an array
    while (false !== ($file = readdir($handle))) {
      if ($file != "." && $file != "..") {
      $file_array[] = $file;
      }
    }
    closedir($handle);
    //process array of files
    reset($file_array);
    while (list(,$filename)=each($file_array)) {
      //check file time
      if (filemtime($maint_folder."/".$filename)<$last_maint_date) @unlink($maint_folder."/".$filename);
    }
  }
}

function reduire_image_ex($img, $taille,$axes="both",$last_maint_date,$maint_delay,$align) {

  if (strlen($img) > 0) {
		// passage de variable
                            $logo=$img;
                            $espace=5; //espace entre l'image et le texte

if ($logo!='') {
                        $logo = substr($logo, 4, strlen($logo));
			// recuperer nom de l'image et sa terminaison
			$path = dirname($logo);
			if ($path!="") $path="resized/";        //on cré le répertoire "resized"
			if (!is_dir("IMG/resized")) @mkdir("IMG/resized");

                        $basename = basename($logo);
                        $nom = substr($basename, 0, strpos($basename, "."));
			$format = substr($basename, strlen($basename)-3, strlen($basename));

		        $axes=strtolower($axes);
		        if ($axes!="both" && $axes!="x" && $axes!="y") $axes="both";
			// test de recalcul en fonction des dates des fichiers
			// pour verifier si mise a jour plus recente du logo
			$imagefile="IMG/$path$taille-$axes-$nom.$format";
             if (file_exists($imagefile)) {
				$imagetime=filemtime($imagefile);
                      if ($imagetime > filemtime("IMG")) {
					//check filetime and touch if filetime>last maiteinance time + half delay
                                      if ($imagetime<($last_maint_date+$maint_delay/2) and time()>($last_maint_date+$maint_delay/2)) touch($imagefile);
                                        return "<img src='$imagefile' name='$name' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' class='spip_logos' />";
					$recalculer = false;
			}
			else {
					$recalculer = true;
				}
              } else {
				$recalculer = true;
			}

			$gd_formats = lire_meta("gd_formats");
             if ($recalculer AND ereg($format, $gd_formats)) {
				// Recuperer l'image d'origine
				if ($format == "jpg") {
					$srcImage = ImageCreateFromJPEG("IMG/$logo");
				}
				else if ($format == "gif"){
					$srcImage = ImageCreateFromGIF("IMG/$logo");
				}
				else if ($format == "png"){
					$srcImage = ImageCreateFromPNG("IMG/$logo");
				}
				if (!$srcImage) return;

				// Calculer le ratio

				$srcWidth = ImageSX($srcImage);
				$srcHeight = ImageSY($srcImage);

				if (($srcWidth > $taille && ($axes=="both" OR $axes=="x")) OR ($srcHeight > $taille && ($axes=="both" OR $axes=="y"))) {
                               $ratioWidth = $srcWidth/$taille;
					$ratioHeight = $srcHeight/$taille;

					//Ridimensiono da altezza (solo se axes!=x)
                                     if ($ratioWidth < $ratioHeight && $axes!="x") {
						$destWidth = floor($srcWidth/$ratioHeight);
						$destHeight = $taille;
					}
					else {
						$destWidth = $taille;
						$destHeight = floor($srcHeight/$ratioWidth);
					}
				} else {
					return $img;
				}

				// Initialisation de l'image destination
				if ($GLOBALS['flag_ImageCreateTrueColor'] AND $destFormat != "gif")
					$destImage = ImageCreateTrueColor($destWidth, $destHeight);
				if (!$destImage)
					$destImage = ImageCreate($destWidth, $destHeight);
				// Recopie de l'image d'origine avec adaptation de la taille
				$ok = false;
				if ($GLOBALS['flag_ImageCopyResampled'])
					$ok = ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
				if (!$ok)
					$ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);

				// Sauvegarde de l'image destination
				$destination = $imagefile;
				if ($format == "jpg") {
					ImageJPEG($destImage, $destination, 70);
				}
				else if ($format == "gif") {
					ImageGIF($destImage, $destination);
				}
				else if ($format == "png") {
					ImagePNG($destImage, $destination);
				}
				ImageDestroy($srcImage);
				ImageDestroy($destImage);

				return "<img src='$destination' name='$name' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' class='spip_logos' />";
                   } else {
				$taille_origine = @getimagesize("IMG/$logo");
				if ($taille_origine) {
					// Calculer le ratio
					$srcWidth = $taille_origine[0];
					$srcHeight = $taille_origine[1];

					if (($srcWidth > $taille && ($axes=="both" OR $axes=="x")) OR ($srcHeight > $taille && ($axes=="both" OR $axes=="y"))) {
						$ratioWidth = $srcWidth/$taille;
						$ratioHeight = $srcHeight/$taille;

						if ($ratioWidth < $ratioHeight && $axes!="x") {
							$destWidth = floor($srcWidth/$ratioHeight);
							$destHeight = $taille;
						}
						else {
							$destWidth = $taille;
							$destHeight = floor($srcHeight/$ratioWidth);
						}
					} else {
						$destWidth = $srcWidth;
						$destHeight = $srcHeight;
                                                }
					return "<img src='IMG/$logo' name='$name' width='$destWidth' height='$destHeight' border='0' align='$align' alt='' hspace='$espace' vspace='$espace' class='spip_logos' />";
                     }
		}

}
}
}

Où téléchargez le fichier joint

Pour l’utilisation, il suffit d’apliquer le filtre comme ceci :

[(#LOGO_ARTICLE|fichier|vignettes{100,center})]

Ou « 100 » est la taille de la vignette et « center » sa position (elle peut prendre left ou right)

Un exemple est disponible à cet emplacement : c2r

Dernière modification de cette page le 23 septembre 2007

Discussion

Aucune discussion

Ajouter un commentaire

Qui êtes-vous ?

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom