Fonction vignettes

All contributions published for previous SPIP versions

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

updated on 23 September 2007

Discussion

Aucune discussion

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom