Redimensionner un logo

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

Ce filtre permet de réduire proportionnellement (si nécessaire) un logo dans un rectangle de dimensions données. Les dimensions en pixels sont passées en paramètre du filtre (à partir de SPIP 1.5a2) ce qui permet de réutiliser le même filtre à volonté.
ACTUALITE : depuis SPIP 1.8 on peut se servir du filtre standard image_reduire : |image_reduire{largeur,hauteur}
/*
 *   +----------------------------------+
 *    Nom du Filtre :    redimlogo
 *   +----------------------------------+
 *    Date : mercredi 16 avril 2003
 *    Auteur :  Roustoubi (roustoubi@tiscali.fr)
 *   +-------------------------------------+
 *    Fonctions de ce filtre :
 *    Renvoie les paramètres width & height pour réduire
 *    proportionnellement (si nécessaire) un logo dans un
 *    rectangle de dimensions données
 *    Les dimensions sont passées en paramètre du filtre
 *    (à partir de SPIP v.1.5a2)
 *    Exemple d'application :
 *    [<img src="IMG/(#LOGO_RUBRIQUE|fichier)"][(#LOGO_RUBRIQUE|fichier|texte_script|redimlogo{200,0})>]
 *   +-------------------------------------+ 
 *  
 * Pour toute suggestion, remarque, proposition d'ajout
 * reportez-vous au forum de l'article :
 * http://www.uzine.net/spip_contrib/article.php3?id_article=110
*/

function redimlogo ($image, $largeur_maxi=0, $hauteur_maxi=0) {
	$image= "IMG/$image";
	if ($largeur_maxi<=0 AND $hauteur_maxi<=0) {} // Pas de mise à l'échelle si négatif ou nul
	elseif ($image != "IMG/") { // Que si l'image existe !
		$dim_image = @GetImageSize($image);
		$largeur_image = $dim_image[0];
		$hauteur_image = $dim_image[1];
		if ($largeur_image+$hauteur_image>0) { 
			// Calcul des facteurs de réduction
			$reduction_largeur = $largeur_maxi/$largeur_image;
			$reduction_hauteur = $hauteur_maxi/$hauteur_image;
			// Choix du "bon" facteur de réduction
			if ($reduction_largeur<=0) { $reduction = min(1,$reduction_hauteur); }
			elseif ($reduction_hauteur<=0) { $reduction = min(1,$reduction_largeur); }
			else {$reduction = min(1, $reduction_hauteur, $reduction_largeur); }
			// Calcul des paramètres à renvoyer
			$largeur = ceil($largeur_image*$reduction);
			$hauteur = ceil($hauteur_image*$reduction);
			$parametres = "height=\"".$hauteur."\" width=\"".$largeur."\"";
		}
	}
	return $parametres;
}
// FIN du Filtre redimlogo

Ce script est dérivé d’autres que j’ai pu voir sur différents sites de contrib, mais j’ai oublié lesquels (leurs auteurs voudront bien m’excuser ou se signaler). Je suis excessivement débutant en php donc les pros voudront bien me pardonner le code qui n’est peut-être pas optimisé mais qui fonctionne.

Attention cependant : ce filtre n’est qu’un garde-fou contre les explosions de maquettes. Le redimensionnement de l’image par le navigateur est de qualité très fluctuante, sans compter que l’image trop grande sera nécessairement plus lente à afficher. Le filtre ne dispense donc pas de reprendre a posteriori les images trop grandes pour les redimensionner et les optimiser dans un logiciel graphique.

Discussion

7 discussions

  • 1

    Salut, j’ai optimisé ton filtre pour qu’il s’emploie plus naturellement, c’est à dire avec un appel de la forme :

    (#LOGO_ARTICLE|left|#URL_ARTICLE|redimlogo{40,40})
    
    Voici le nouveau code pour parvenir à ça :
    
    function redimlogo ($image, $largeur_maxi=0, $hauteur_maxi=0)
    {
            if ($largeur_maxi<=0 AND $hauteur_maxi<=0) {} // Pas de mise à l'échelle si négatif ou nul
            elseif ($image != "")
            { // Que si l'image existe !
                    preg_match('|[Ss][Rr][Cc][ \t\r\n]*=[ \t\r\n]*["\']?([\w_\-\./]+)|',$image,$nomimage);
                    $nomimage = $nomimage[1];
                    $dim_image = GetImageSize($nomimage);
                    $largeur_image = $dim_image[0];
                    $hauteur_image = $dim_image[1];
    
                    if ($largeur_image+$hauteur_image>0)
                    {
                            // Calcul des facteurs de réduction
                            $reduction_largeur = $largeur_maxi/$largeur_image;
                            $reduction_hauteur = $hauteur_maxi/$hauteur_image;
                            // Choix du "bon" facteur de réduction
                            if ($reduction_largeur<=0) { $reduction = min(1,$reduction_hauteur); }
                            elseif ($reduction_hauteur<=0) { $reduction = min(1,$reduction_largeur); }
                            else {$reduction = min(1, $reduction_hauteur, $reduction_largeur); }
                            // Calcul des paramètres à renvoyer
                            $largeur = ceil($largeur_image*$reduction);
                            $hauteur = ceil($hauteur_image*$reduction);
    
                            if ($largeur != $largeur_image || $hauteur != $hauteur_image)
                            {
                                    $parametres = " HEIGHT=$hauteur WIDTH=$largeur";
                                     // On enlève les paramètre de hauteur et largeur éventuellement déjà présents
                                    $image = preg_replace('/[Hh][Ee][Ii][Gg][Hh][Tt][ \t\r\n]*=[ \t\r\n]*["\']?[ \t\r\n]*\d+[ \t\r\n]*%?[ \t\r\n]*["\']?[ \t\r\n]*/','',$image);
                                    $image = preg_replace('/[Ww][Ii][Dd][Tt][Hh][ \t\r\n]*=[ \t\r\n]*["\']?[ \t\r\n]*\d+[ \t\r\n]*%?[ \t\r\n]*["\']?[ \t\r\n]*/','',$image);
    
                                    // On met les nouveaux paramètres
                                    $image = preg_replace('/<[Ii][Mm][Gg]/','<IMG'.$parametres,$image);
                            }
                    }
            }
            return $image;
    }
    • Bonjour j’ai testé ton filtre ça marche. Mais il y a un problème au niveau de la hauteur. Lorsque je met les paramètres : [(#LOGO_ARTICLE|left|#URL_ARTICLE|redimlogo200,500)]
      et [(#LOGO_ARTICLE|left|#URL_ARTICLE|redimlogo200,200)] et même
      [(#LOGO_ARTICLE|left|#URL_ARTICLE|redimlogo200,0)] donnent les mêmes résultats.
      Alors que j’aimerais pouvoir changer à volonté la largeur et la hauteur. Merci de me repondre.

    Répondre à ce message

  • 1
    johnny stakhanov

    Bonjour,

    Bravo, le script marche... mais sous firefox seulement, pas sous IE. Et malheureusement, certains visiteurs utilisent encore IE. Je peux désactiver la fonction pour IE mais y’a pas une autre solution ?

    • Bonjour,
      je travaille avec IE, et j’ai testé le script avec ; ça marche bien. J’ai qd même effectué une petite modification, car qd je met le logo dans un div il prend tout l’espace :

      Dans l’exemple donnée(après Exemple d’application...)j’ai changé la position des « [ » comme suite :

      * Exemple d’application :
      * }}(#LOGO_RUBRIQUE}}" [(#LOGO_RUBRIQUE|fichier|texte_script|redimlogo{200,0}){{]}}>

    Répondre à ce message

  • 2

    je me bagarre avec ce filtre depuis un certain temps ;
    alors est ce la bonne syntaxe

    $events[$date][] = array(’link’ => ’#URL_ARTICLE’, ’title’ => ’(#TITRE’, ’logo’ => « #LOGO_ARTICLE_RUBRIQUE|redimlogo5,5) ») ;

    @+

    • Moi je me le suis adapté comme ceci ça rajoute le lien directement :

      function redimlogo ($image, $largeur_maxi, $hauteur_maxi)
      $image= « IMG/$image » ;
      if ($largeur_maxi<=0 AND $hauteur_maxi<=0) {} // Pas de mise à l’échelle si négatif ou nul
      elseif ($image != "IMG/") // Que si l’image existe !
      $dim_image = @GetImageSize($image) ;
      $largeur_image = $dim_image[0] ;
      $hauteur_image = $dim_image[1] ;
      if ($largeur_image+$hauteur_image>0)
      // Calcul des facteurs de réduction
      $reduction_largeur = $largeur_maxi/$largeur_image ;
      $reduction_hauteur = $hauteur_maxi/$hauteur_image ;
      // Choix du « bon » facteur de réduction
      if ($reduction_largeur<=0) $reduction = min(1,$reduction_hauteur) ;
      elseif ($reduction_hauteur<=0) $reduction = min(1,$reduction_largeur) ;
      else $reduction = min(1, $reduction_hauteur, $reduction_largeur) ;
      // Calcul des paramètres à renvoyer
      $largeur = ceil($largeur_image*$reduction) ;
      $hauteur = ceil($hauteur_image*$reduction) ;
      $parametres = "" ;


      return $parametres ;

      Et dans le fichier html :[(#LOGO_ARTICLE|fichier|texte_script|redimlogo150,150,1)]
      pour un logo d’article, évidement.

    • Merde, j’ai débloqué pour le message !!!

      V’la l’script :

      $parametres = "<a href='".$image."'><img src=\"".$image."\" height=\"".$hauteur."\" width=\"".$largeur."\"></a>";

      C’est juste la dernière ligne

      et dans le fichier html : [(#LOGO_ARTICLE|fichier|texte_script|redimlogo150,150,1)]

      Pour un logo d’article

    Répondre à ce message

  • bonjour, personne n’a de pb avec ce filtre ?
    parce que moi mon logo ne change pas de taille du tout.
    j’applique aussi le filtre pour redimensionner une image dans un article et celui-ci fonctionne...

    c’est bien comme ça ?
    [(#LOGO_ARTICLE|left|#URL_ARTICLE|redimlogo{50,0})]

    Répondre à ce message

  • François

    Même problèmle de mon coté. j’ai implémenté cette fonction. Cela ne fonctionne pas car mes images restent à leur taille d’origine. Par contre il les affiche ce qui est déjà cela ;-)

    Répondre à ce message

  • dominique

    Bonjour, il ne faut pas oublier ta mise en garde :
    « Attention cependant : ce filtre n’est qu’un garde-fou contre les explosions de maquettes. Le redimensionnement de l’image par le navigateur est de qualité très fluctuante, sans compter que l’image trop grande sera nécessairement plus lente à afficher. Le filtre ne dispense donc pas de reprendre a posteriori les images trop grandes pour les redimensionner et les optimiser dans un logiciel graphique. »

    Aussi, pour éviter l’explosion d’un site lors de l’ajout d’une image trop grande par un rédacteur, vous pouvez aussi, dans les styles css, imposer des tailles maximum à vos balises « DIV » et ainsi, l’image sera tronquée, ce qui est préfèrable...

    Pour cela, il faut utiliser l’option : overflow : hidden ;

    Répondre à ce message

  • 6

    Salut !

    J’ai essayé de combiner ton filtre avec celu permettant d’ombrer les logos et cela n’a pas fonctionné :-(. Quelqu’un sait-il pourquoi ? Mieux encore : quelqu’un a-t-il une solution ?

    Merci d’avance

    • roustoubi

      Salut Chris,

      en fait, ces deux filtres ne sont pas compatibles en tant que tel parce qu’ils ne renvoient pas la même chose.

      Si tu regardes le code de ce filtre, il ne fait que renvoyer au sein de la balise <img> la taille (hauteur et largeur) maxi à afficher pour ne pas dépasser le cadre que tu t’es fixé.

      En revanche, le filtre d’ombre automatique renvoie un tableau contenant l’image au centre avec autour les effets d’ombre.

      Donc tu ne peux pas appliquer successivement ces filtres puisque tu ne peux pas déduire un tableau des deux dimensions que renvoie mon filtre, et inversement ces deux dimensions ne permettent pas de redimensionner le tableau que renvoie le filtre d’ombre.

      La seule solution serait de combiner l’esprit de ces deux filtres en reprogrammant un troisième filtre où le tableau d’ombres tienne compte des dimensions calculées comme dans ce filtre.

    • Salut Roustoubi !

      Merci pour ton explication, c’est très clair, mais c’est dommage que ces deux filtres ne soient pas compatibles car je pense réellement que cela serait utile. Je ne suis pas programmeur php et je suis vite dépassé par la programmation mais j’essayerais peut-être de faire un filtre qui combine ses deux filtres à mes heures perdues. Mais si une bonne âme veux s’y coller je serais ravi de jouer le testeur ;-)

      Au plaisir Roustoubi !

    • asso.bachant

      a quel endroit doit t’on définir la taille de l’image est ce ici

    • C’est dans le squelette, au niveau de |redimlogo{200,0}) (les valeurs 200 et 0 sont à remplacer selon tes souhaits).

      Il n’y a rien à modifier dans le filtre lui même.

    • asso.bachant

      ça fonctionne, mais bizarrement je n’ai pas de redimensionnement de logo................

      suis je bête, encore faudrait t’il pouvoir mettre un logo ...........

      va falloir que je regarde mes squelettes d’un peu plus prés

    • et comment arrive-ton jusqu’au squelette ? c’est quel fichier ?
      est-ce que le filtre doit etre ajouté dans le fichier mes_options.php3 ou mes_fonctions.php3 ?
      si c’est mes_fonctions , comment faire pour créer le fichier ?
      desolé pour ce flux de questions, mais je suis complètement débutant en spip

    Répondre à ce message

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

Dernière modification de cette page le 24 juin 2011