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 ImagikDraw();
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_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)
- 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.)