PHP - Notes perso sur Imagick 2 - ImagickDraw... si on dessinait ?

Deuxième épisode de mes notes perso sur la bibliothèque Image magic pour évoquer la classe ImagickDraw qui, comme son nom l'indique, permet de dessiner avec Imagick. ( 1er épisode )

On va se limiter à des usages basiques parce que la lecture du sommaire suffit à imaginer des possibilités certes alléchantes mais totalement hors de propos en ce qui me concerne (courbes de bézier etc)

Spoiler: c'est nettement moins intuitif et simple que pour le traitement d'image... l'écart entre Imagick et GD dans le domaine du tracé n'est plus si évident: ça mériterait de faire un classe pour simplifier tout ça... ( /me se jette sur son bujo pour griffonner spasmodiquement)

Préambule

Cette classe crée un objet servant d'instructions à appliquer ensuite à un objet Imagick.

On partira du principe que vous avez fait des instances des classes comme suit:

$im=new Imagick(); # l'image dans laquelle vous allez appliquer l'objet ImagickDraw
$draw=new ImagickDraw();

Ajouter un texte

Fixer les caractéristiques

  • $draw->setFont(fonte); : sélectionne la fonte à utiliser
  • $draw->setFontSize(taille); : définit la taille en pixels
  • $draw->setFillColor(couleur);: définit la couleur de fond (normalement, couleur est un objet ImagickPixel, voir 1er épisode mais on peut passer une chaîne au format de couleur CSS )
  • $draw->setTextAlignment(alignement); : une des constantes d'alignement imagick::ALIGN_LEFT imagick::ALIGN_CENTER Imagick::ALIGN_RIGHT
  • $draw->setGravity(Imagick::GRAVITY_CENTER); centre le texte dans sa boîte (horizontal et vertical)
  • $draw->setTextDecoration(decoration): une des constantes de décoration imagick::DECORATION_UNDERLINE imagick::DECORATION_OVERLINE imagick::DECORATION_LINETROUGH et bien d'autres (comme du... bruit ?!).
  • $draw->setTextAntialias(true);: ajouter de l'antialias
  • l'espacement :
    • entre les mots : $draw->setTextInterwordSpacing(taille)
    • entre les lignes : $draw->setTextInterlineSpacing(taille)

Tracer le texte

  • $draw->annotation(x,y,texte) : trace un texte dans la police sélectionnée
  • $im->annotateImage( $draw, 0, 0, 0, $fontName ); : ajoute le texte à l'image.

Obtenir des infos utiles

  • obtenir la liste des polices disponibles: $im->queryFonts($pattern = "*") 🆒 on peut filtrer avec une pattern à la façon de glob().
  • obtenir les infos fixées par setXXX : getXXX ... ainsi on a getFont(), getFontSize() etc...
  • obtenir les dimensions de la boîte de texte: $im->queryFontMetrics($draw, text); on récupère un tableau comme ci-dessous
  • 
    Array
    (
        [characterWidth] => 9
        [characterHeight] => 9
        [ascender] => 9 # la taille au-dessus de la baseline
        [descender] => -2 # la taille sous la baseline
        [textWidth] => 71
        [textHeight] => 10
        [maxHorizontalAdvance] => 12
        [boundingBox] => Array
            (
                [x1] => 0
                [y1] => -2
                [x2] => 6.890625
                [y2] => 7
            )
        [originX] => 70
        [originY] => 0
    )
    

    Dessiner des formes

    Fixer les caractéristiques

    • opacité du trait : $draw->setStrokeOpacity(0-1);
    • couleur du trait : $draw->setStrokeColor(couleur);
    • épaisseur du trait : $draw->setStrokewidth(nb);
    • type de trait : $draw->setStrokeDashArray() Le motif semble être plein de possibilités car on peut le définir très spécifiquement et même utiliser une image comme motif (->setStrokePatternURL)
    • couleur de remplissage : $draw->setFillColor(couleur);

    Formes

    • cercle : $draw->circle ($x, $y, $x + $r, $y);
    • ellipse : $draw->ellipse($ox,$oy,$rx,$ry,$start,$end);
    • point : $draw->point ($x, $y);
    • polygone : $draw->polygon ($tableau_de_coordonnées); : array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 )
    • ligne brisée : $draw->polyline ($tableau_de_coordonnées); : array( 'x' => 3, 'y' => 4 ), array( 'x' => 2, 'y' => 6 )
    • rectangle : $draw->rectangle ($x, $y, $x2, $y2); )
    • rectangle arrondi: $draw->roundRectangle ($x, $y, $x2, $y2,$rayonx,$rayony);

    Exemple

    Pour écrire un texte dans une image:

    
    $text='pipo et mollo';
    $im=new Imagick();
    $draw=new ImagickDraw();
    //var_dump($im->queryFonts('*'));exit;
    $draw->setFont( 'Courier' );
    $draw->setFontSize( 20 );
    $draw->setFillColor( 'black' );
    $draw->setTextAntialias(true);
    $metrics = $im->queryFontMetrics($draw, $text);
    $draw->annotation(0,$metrics['ascender'],$text);
    $im->newImage( 300, 20, 'lightblue');
    $im->drawImage($draw);
    $im->setImageFormat( 'png' );
    header('Content-type: image/jpeg');
    exit($im);  
    
    ce qui donne cette image
    index2.png
    C'est pas ouf...

    Il serait intéressant de pousser les tests mais là, j'ai pas le temps...

    Peut-être reprendrais-je des trucs existant avec tout ça ( scriptopic, RoR, Stamp mematic etc etc.)

    Et c'est là que Bronco prit  conscience de la quantité de   merdes affligeantes qu'il avait  codées sur un coup de tête  à la va-comme-je-te-pousse   et qu'il avait infligées à tous...

    Googol résiste (et ça fait du boulot)

    imgbin-computer-icons-avatar-deadpool-desktop-deadpool-pixel-art-x5Gc4h4YnvARncaJgpPeGT2bw.png
    La version 4.2 «unban» de Googol est en phase de test et elle m'a pris le pack premium de chez MaximumEffort. Toutefois, ça valait le coup: plutôt que de me contenter de rediriger vers duckduckgo lors du bannissement par google - ce qui arrivait de plus en plus souvent - j'ai opté pour l'utilisation temporaire d'un moteur alternatif à la place de google...

    (...)

    Plugin pluxml: reposter vers mastodon directement.

    icone
    Si ça intéresse quelqu'un, voici un plugin dont le but est de reposter automatiquement les billets de pluxml vers un compte mastodon.

    pluxml2mastodon utilise le chapô ou le contenu (si le chapô est vide) comme corps de message en le retaillant si nécessaire.

    Dans les options, il faudra compléter l'url de votre instance et le jeton de sécurité; vous pouvez également ajouter un message d'en-tête et de pied, si vous le souhaitez.

    (...)

    C'est con, j'ai ri 4

    Pour celles et ceux qui en ont marre de leur semaine, de la météo, de la politique, des affaires, des gens qui tuent leurs conjoints alors qu'ils faisaient genre «chuis trop inquiet sur la vie de ma reum», du code du travail, des inondations, qu'on leur parle de la Seine ou des nichons de la famille Kardachiants, voici un Dump du Dredi: attention, c'est con (mais j'ai ri )

    (...)

    Go ! - un raccourcisseur d'URL

    Il y a quelques jours, j'ai eu à filer un lien vers un travail à mes élèves, j'avais donné un qrcode mais, bien entendu, la plupart ne savait même pas de quoi il s'agissait et ne disposaient de toutes façons pas de l'appli; les voilà donc partis pour taper l'url dans le navigateur, pour ceux qui savaient ce que c'était, ou dans la recherche google pour les autres ...

    Or, facteur aggravant, l'URL était longue et alambiquée ce qui, pour des mômes qui ont la capacité de rétention d'un bulot cuit, constituait déjà un challenge qui aurait à lui seul pu subir une évaluation notée.

    GrosJean comme devant, je me promets in petto de coder à l'arrache un raccourcisseur d'url perso, histoire de ne plus perdre 22 minutes à attendre que tout le monde ait tapé les bons caractères dans le bon ordre et dans la bonne case...

    Donc, voilà, c'est fait.

    capture

    C'est très minimaliste, fait à l'arrache, mais ça fonctionne: la page d'accueil contient une case pour taper l'url à raccourcir et une autre si vous voulez spécifier un code particulier (sinon, il génère au hasard): si vous précisez un code qui existe déjà, il écrasera l'ancien.

    Voir la démo Télécharger le zip

    C'est publié sous licence faisCeQueTuVeuxMaGueule (n'hésitez pas à virer le lien du footer si vous voulez )

    [plugin] MyStaticStartPage : rediriger vers une page d'accueil hors de PluXML

    Il y a quelques temps Cyrille Borne s'est fait une page d'accueil qui lui permettait de rediriger les visiteurs vers les différentes parties de son site, pluXML n'en constituant que la section Blog. Si je me souviens bien, il a un peu galéré à cause de la redirection de son blog vers https://cyrille-borne.com/pluxml qui avait cassé les liens de ses lecteurs vers son flux RSS.

    Je me suis alors dit, ben pourquoi pas moi ?! Seulement, je me voyais pas galérer de la même façon. Donc, j'ai fait un plugin... Un tout chti: là on est sur du (je déteste cette expression pour VRP) made in 5 minutes... c'est simple, j'ai passé plus longtemps sur la rédaction de ce billet que sur la réalisation du plugin...

    Donc, en gros, vous précisez dans la config l'adresse de la page servant d'accueil extérieur et c'est tout: le site ne redirige vers cette page que si on vient de l'extérieur et qu'on cherche à accéder à la page root du site.

    Je n'ai pas constaté que ça ait cassé quoi que ce soit chez moi, mais bon, la journée n'est pas terminée

    Téléchargez le zip

    ma page d'accueil

    Unicode - html

    J'ai mis à jour la page unicode.warriordudimanche.net pour ajouter la quantité de caractères qui manquaient.
    J'ai un peu recodé pour pouvoir faire des packs avec les listes qui ne se suivent pas (genre les maths, 4 packs ), j'ai ajouté un favicon et j'ai un peu changé le look...


    Si ça intéresse kékin, ben c'est par là : http://unicode.warriordudimanche.net/
    (le github: https://github.com/broncowdd/unicode_page )

    Au passage, petit message à Cyrille qui ne manquera pas de grogner à propos de Bozon3:





    [Plugin] Tag Editor: mettre de l'ordre dans les tags de pluXML

    Je viens de m'apercevoir que j'ai omis de partager un plugin que j'avais fait pour mettre de l'ordre dans les tags de mes articles...

    C'est tout con mais ça permet de faire le taf simplement.

    capture Une fois le plugin activé, un lien apparaît dans le menu admin. Sur la page dédiée, les tags sont listés en deux colonnes: celle de droite permet de faire les modifications. Pour effacer un tag, effacez-le de la colonne de droite et sauvegardez...

    Allez, amusez-vous et allez dans le pet du saigneur.

    Tags_editor.zip

    Galart: plus simple, comme galerie, spapossib' (plugin pluXML) [EDIT]

    Comme ma moitié galérait avec son site de portfolio/galerie-usine à gaz, je lui ai proposé de monter un petit pluXML avec un plugin que je lui goupillerais entre deux tâches parentales, en mode charrette (mon favori)

    Donc, prenant mon courage à deux mains et mon clavier, j'ai bricolé ça dans la journée.

    Il s'agit d'un plugin volontairement minimaliste: il permet simplement de lier un dossier contenant des images (contenu dans le dossier data/images) à un article.

    Lors de l'affichage dudit article, la galerie sera générée et ajoutée en fin d'article automatiquement et sans aucune autre intervention.

    Une page de config, minimale elle aussi, permet de fixer la taille des miniatures (à configurer avant utilisation)

    EDIT du 23/08

    J'ai appliqué les modifs proposées par JerryWham et j'ai ajouté un flux rss pour la galerie: chaque article contenant une galerie propose le lien rss vers le contenu du dossier.

    Télécharger Galart.

    C'est très perfectible, mais bon, pour le moment, je peux pas mieux

    Exemple de galerie:

    RSS

    Pouetter sur pluXML: un plugin.

    Une époque, j'utilisais mon plugin RssFeedContent pour afficher le dernier toot... Mais ça, c'était avant le drame, bien entendu...

    J'ai fait, en mode plein le joufflu, un petit plugin pour afficher un ou plusieurs pouets:

    • Téléchargez le plugin et dézippez-le,
    • activez-le et configurez-le (l'url RSS du profil s'obtient en rajoutant «.atom» à l'url du profil; ex: framapiaf.org/@bronco.atom )
    • ajoutez le hook suivant où bon vous semble dans le thème:
    <?php eval($plxShow->callHook("showLastPouet")) ?>

    C'est toot, pardon... tout !

    (...)

    Obtenez des flux RSS sur les réseaux sociaux et le web 2.0

    Petit résumé de ceux qui peuvent m'intéresser...

    Dailymotion

    Suivi de commentaires par mail pour pluXML

    Il y a quelques temps, j'avais bricolé un plugin pour Cyrille afin de permettre aux usagers du site de s'abonner par mail aux commentaires d'un article. Comme il s'est trouvé quelqu'un d'autre que ça semblait intéresser, je pose là le bouzin

    Pour faire simple, le plugin ajoute une case permettant de s'abonner dans le formulaire de commentaire.

    Quand un commentaire est posté et validé, l'abonné reçoit un email contenant le commentaire ainsi que des liens vers l'article, le commentaire et le désabonnement.

    L'auteur de l'article peut, lui aussi, recevoir un mail pour tout commentaire posté (voir la page de config du plugin)

    Comme toujours, c'est fait un peu à l'arrache, entre deux perturbations familiales... (j'ai compté une fois: en deux heures, les boulets m'on interrompu près de 40 fois: j'ai fait la liste sur un des postits, optimiste que j'étais)

    N'hésitez pas à proposer des améliorations

    Télécharger le zip

    (...)

    Fil RSS des articles