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'alignementimagick::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écorationimagick::DECORATION_UNDERLINE imagick::DECORATION_OVERLINE imagick::DECORATION_LINETROUGHet 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)
- entre les mots :
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
$im->queryFonts($pattern = "*") 🆒 on peut filtrer avec une pattern à la façon de glob().$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

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.)


)



), j'ai ajouté un favicon et j'ai un peu changé le look...
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...


























