Contactez-nous

1

Une fonction pour appliquer une série de filtres

15 avril 2006
par ARNO*

[SPIP 1.9 et GD2] Si vous suivez ces trucs et astuces depuis un moment, vous avez pu constater que l’utilisation des filtres graphiques devient réellement impressionnante lorsqu’on combine plusieurs filtres successifs. Dans l’exemple du titre en relief, le code SPIP devient interminable, dès lors que non seulement on applique une série de filtres mais que de plus on « fusionne », avec image_masque, deux images calculées.

Et plus votre maîtrise des filtres graphiques progressera, plus vous aurez des idées d’utilisations aussi imaginatives que possibles, et plus le code s’alourdira.

L’idée consistera alors à ne plus appeler successivement une interminable série de filtres, mais à se fabriquer une fonction PHP qui, servant de filtre SPIP, fabriquera directement la longue combinaison de filtres. Votre code SPIP deviendra plus lisible et, par ailleurs, le code PHP de votre fonction spécifique sera certainement plus lisible (et donc facile à modifier et à maintenir).

Reprenons simplement le code auquel nous étions parvenu pour réaliser le texte en relief :

Si vous le copiez-collez dans un éditeur texte (c’est le but !), vous constatez qu’il est assez lourd :
— sept filtres graphiques succesifs,
— un filtre utilisé à l’identique deux fois...

Remplaçons maintenant ce code par l’appel à un unique filtre :

Dans mes_fonctions, on insère la fonction PHP correspondante, qui tout simplement synthétisera la succession de filtres :

  1. function mon_relief($texte,$coul) {
  2. $source = image_typo($texte,"police=stencil.ttf","couleur=$coul","taille=40","padding=4");
  3.  
  4. $est = image_flou($source, 2);
  5. $est = image_estampage_alpha($est, 1, 1.5);
  6. $est = extraire_attribut($est, "src");
  7.  
  8. $ret = image_masque($source, $est, "top=-1", "left=-1");
  9. $ret = image_masque($ret, "masque-grad.png");
  10.  
  11. return $ret;
  12. }

Télécharger

C’est tout de même beaucoup plus lisible !

Notez tout de même cette « astuce » : certains filtres graphiques, tels que image_typo et image_masque, pour pouvoir passer une liste de paramètres indéterminés et dans n’importe quel ordre, doivent utiliser un format de variables très spécifiques, en tant que chaînes de caractères. D’où les apostrophes, par exemple, pour indiquer :

Notez encore, par rapport aux appels effectués directement en tant que filtres SPIP, qu’ici on retrouve la syntaxe de PHP : les variables sont entourées de parenthèses, alors que dans les squelettes, elles sont passées entourées d’accolades.

  • izo
    Avril 2006

    Pourquoi tu fais pas un plugin de tout ça ? C’est quand plus simple à activer ...

  • Franz
    Juin 2006

    Salut,

    Je suis en train d’essayer d’écrire une fonction personnalisée sur base des conseils que tu donnes ici.

    Je n’ai aucun problème avec la plupart des fonctions données ici. Des choses comme ceci fonctionnent très bien (où masque.png est stocké dans le répertoire des squelettes) :

    Par contre, je ne parviens pas à faire bouffer une image qui ne vient pas directement de SPIP au filtre reduire_image. Ceci, par exemple, ne fonctionne pas :

    C’est moi qui me trompe quelque part ou c’est reduire_image qui ne fonctionne pas de la même manière que les autres ?

    Merci

  • ARNO*
    Juin 2006

    Tu pourrais aussi tester ceci :

    Ce serait plus dans la logique de la comparaison.


    Pour les autres fonctions, je n’ai pas vraiment fait de tests, mais il me semble que pour reduire_image, vieille fonction très compliquée (pour des raisons historiques, je crois), il faut absolument que l’image à traiter se trouve dans le dossier /IMG.

    Pour utiliser des « images personnelles » prédéterminées (et non, comme dans les exemples ici, des images installées en tant que logo ou fichiers joints à des articles), par exemple pour réaliser des éléments d’interface systèmatiques sur le site (par exemple, sur Paris-Beyrouth.org, le logo du site en haut à gauche change de couleur, et c’est un automatisme), alors je fabrique une rubrique bidon (qui ne sera pas affichée) et j’y installe des documents joints que je nomme de manière plutôt explicite. Ensuite, pour récupérer ces documents, il suffit d’une petite boucle qui récupère le document joint ayant tel nom.

  • Franz
    Juin 2006

    Merci de ta réponse. C’est bien ce qu’il me semblait.

    Ce que j’essaye de faire, c’est de publier un filtre coins_arrondis permettant d’arrondir les coins des images, qui permette de régler le rayon de la courbure. Pour ce faire, j’ai besoin de redimensionner mon masque avant de l’appliquer. J’essaye d’arriver à un truc très simple à utiliser, du type :

    1. [(#LOGO_ARTICLE||coins_arrondis{rayon})]

    La solution passant par l’installation du fichier en pièce jointe quelque part au fond d’une rubrique technique complique assez fort le truc, je trouve.

    J’ai créé un ticket trac en suggérant que reduire_image() puisse gérer aussi des images hors de IMG/ http://trac.rezo.net/trac/spip/tick... mais le code de ce filtre a effectivement l’air complexe.

Qui êtes-vous ?
Votre message

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