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

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

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