⚠️ Ceci est un site de traduction non officiel, sans lien avec ImageMagick Studio LLC. Pour des informations officielles, consultez la page originale (https://imagemagick.org/magick-vector-graphics/).

Magick Vector Graphics

Présentation de MVG • Primitives de dessin

Cette spécification définit les fonctionnalités et la syntaxe de Magick Vector Graphics (MVG), un langage modularisé pour décrire des graphiques vectoriels et mixtes vectoriels/matriciels en deux dimensions dans ImageMagick. Vous pouvez utiliser ce langage pour dessiner depuis la ligne de commande, depuis un fichier MVG, depuis un fichier SVG -- Scalable Vector Graphics ou depuis l'une des interfaces de programmation d'ImageMagick. Utilisez cette commande, par exemple, pour rendre un arc :

$ magick -size 100x60 canvas:skyblue -fill white -stroke black \
  -draw "path 'M 30,40  A 30,20  20  0,0 70,20 A 30,20  20  1,0 30,40 Z '" \
  arc.png

et voici le résultat :

arc

Lorsque le dessin devient suffisamment complexe, nous vous recommandons de regrouper les primitives graphiques dans un fichier MVG. Pour notre exemple, nous utilisons piechart.mvg :

push graphic-context
  viewbox 0 0 624 369
  affine 0.283636 0 0 0.283846 -0 -0
  push graphic-context
    push graphic-context
      fill 'darkslateblue'
      stroke 'blue'
      stroke-width 1
      rectangle 1,1 2199,1299
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 600,1100 'Average: 20.0'
    pop graphic-context
    push graphic-context
      fill 'red'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L340.0,600.0 A360.0,360.0 0 0,1 408.1452123287954,389.2376150414973 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,140 'MagickWand for PHP'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,140 '(10.0%)'
    pop graphic-context
    push graphic-context
      fill 'red'
      stroke 'black'
      stroke-width 4
      rectangle 1330,100 1370,140
    pop graphic-context
    push graphic-context
      fill 'yellow'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L408.1452123287954,389.2376150414973 A360.0,360.0 0 0,1 976.5894480359858,369.56936567559273 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,220 'MagickCore'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,220 '(29.0%)'
    pop graphic-context
    push graphic-context
      fill 'yellow'
      stroke 'black'
      stroke-width 4
      rectangle 1330,180 1370,220
    pop graphic-context
    push graphic-context
      fill 'fuchsia'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L976.5894480359858,369.56936567559273 A360.0,360.0 0 0,1 964.2680466142854,844.4634932636567 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,300 'MagickWand'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,300 '(22.9%)'
    pop graphic-context
    push graphic-context
      fill 'fuchsia'
      stroke 'black'
      stroke-width 4
      rectangle 1330,260 1370,300
    pop graphic-context
    push graphic-context
      fill 'blue'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L964.2680466142854,844.4634932636567 A360.0,360.0 0 0,1 757.853099990584,955.3210081341651 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,380 'JMagick'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,380 '(10.6%)'
    pop graphic-context
    push graphic-context
      fill 'blue'
      stroke 'black'
      stroke-width 4
      rectangle 1330,340 1370,380
    pop graphic-context
    push graphic-context
      fill 'lime'
      stroke 'black'
      stroke-width 5
      path 'M700.0,600.0 L757.853099990584,955.3210081341651 A360.0,360.0 0 0,1 340.0,600.0 z'
    pop graphic-context
    push graphic-context
      font-size 40
      fill 'white'
      stroke-width 1
      text 1400,460 'Magick++'
    pop graphic-context
    push graphic-context
      font-size 30
      fill 'white'
      stroke-width 1
      text 1800,460 '(27.5%)'
    pop graphic-context
    push graphic-context
      fill 'lime'
      stroke 'black'
      stroke-width 4
      rectangle 1330,420 1370,460
    pop graphic-context
    push graphic-context
      font-size 100
      fill 'white'
      stroke-width 1
      text 100,150 'ImageMagick'
    pop graphic-context
    push graphic-context
      fill 'none'
      stroke 'black'
      stroke-width 5
      circle 700,600 700,960
    pop graphic-context
  pop graphic-context
pop graphic-context

pour rendre un camembert avec cette commande :

$ magick mvg:piechart.mvg piechart.png

qui produit ce rendu :

piechart

Cependant, en général, MVG est suffisamment difficile à manipuler pour que vous souhaitiez probablement utiliser un programme pour générer vos graphiques au format SVG. ImageMagick convertit automatiquement le SVG en MVG et rend votre image ; par exemple, nous rendons piechart.svg avec cette commande :

$ magick mvg:piechart.svg piechart.jpg

pour produire le même camembert que celui créé avec le langage MVG.

Le dessin est également disponible depuis bon nombre des interfaces de programmation d'ImageMagick. ImageMagick convertit les appels de l'API de dessin en MVG et les rend. Voici un exemple de code écrit dans le langage MagickWand :

(void) PushDrawingWand(draw_wand);
{
  const PointInfo points[6] =
  {
    { 180,504 },
    { 282.7,578.6 },
    { 243.5,699.4 },
    { 116.5,699.4 },
    { 77.26,578.6 },
    { 180,504 }
  };

  DrawSetStrokeAntialias(draw_wand,True);
  DrawSetStrokeWidth(draw_wand,9);
  DrawSetStrokeLineCap(draw_wand,RoundCap);
  DrawSetStrokeLineJoin(draw_wand,RoundJoin);
  (void) DrawSetStrokeDashArray(draw_wand,0,(const double *)NULL);
  (void) PixelSetColor(color,"#4000c2");
  DrawSetStrokeColor(draw_wand,color);
  DrawSetFillRule(draw_wand,EvenOddRule);
  (void) PixelSetColor(color,"#800000");
  DrawSetFillColor(draw_wand,color);
  DrawPolygon(draw_wand,6,points);
}
(void) PopDrawingWand(draw_wand);

Présentation de MVG

MVG ignore tous les espaces entre les commandes. Cela permet d'écrire plusieurs commandes MVG par ligne. Il est d'usage courant de terminer chaque commande MVG par un saut de ligne afin de rendre le MVG plus facile à éditer et à lire. Cette description de syntaxe utilise l'indentation dans les séquences MVG pour faciliter la compréhension. L'indentation est prise en charge mais n'est pas obligatoire.

Syntaxe d'enveloppe de métafichier (pour prendre en charge les fichiers MVG autonomes) :

push graphic-context
  viewbox 0 0 width height
  [ any other MVG commands ]
pop graphic-context

Syntaxe de motif (enregistrement et restauration du contexte) :

push pattern id x,y width,height
 push graphic-context
  [ drawing commands ]
 pop graphic-context
pop pattern

en voici un exemple (%s est une chaîne identifiant) :

push defs
 push pattern %s 10,10 20,20
  push graphic-context
   fill red
   rectangle 5,5 15,15
  pop graphic-context
  push graphic-context
   fill green
   rectangle 10,10 20,20
  pop graphic-context
 pop pattern
pop defs

Pour le pavage d'image, utilisez :

push pattern id x,y width,height
 image Copy ...
pop pattern

Notez que vous pouvez utiliser le motif soit pour le fill, soit pour le stroke, comme ceci :

stroke url(#%s)

ou

fill url(#%s)

Le chemin de découpe (clip path) définit une zone de découpe où seule la zone contenue peut être dessinée. Les zones situées en dehors de la zone de découpe sont masquées.

push defs
 push clip-path "myClipPath"
  push graphic-context
   rectangle 10,10 20,20
  pop graphic-context
 pop clip-path
pop defs
clip-path url(#myClipPath)

Primitives de dessin

Voici une description complète des primitives de dessin MVG :

Primitive Description
affine sx,rx,ry,sy,tx,ty
arc x0,y0 x1,y1 a0,a1
bezier x0,y0 ... xn,yn La courbe Bezier (spline) nécessite trois coordonnées x,y ou plus pour définir sa forme. Le premier et le dernier point sont les nœuds (coordonnées préservées) et les coordonnées intermédiaires éventuelles sont les points de contrôle. Si deux points de contrôle sont spécifiés, la ligne entre chaque nœud d'extrémité et son point de contrôle respectif déterminé en séquence détermine la direction de la tangente de la courbe à cette extrémité. Si un seul point de contrôle est spécifié, les lignes reliant les nœuds d'extrémité à ce point de contrôle unique déterminent les directions des tangentes de la courbe à chaque extrémité. Si plus de deux points de contrôle sont spécifiés, les points de contrôle supplémentaires agissent en combinaison pour déterminer la forme intermédiaire de la courbe. Afin de tracer des courbes complexes, il est fortement recommandé soit d'utiliser la primitive Path, soit de tracer plusieurs segments de Bézier à quatre points en répétant les nœuds de début et de fin de chaque segment successif.
border-color color
circle originx,originy perimeterx,perimetery
clip-path url(name)
clip-rule rule Choisissez parmi ces types de règle :
evenodd
nonzero
clip-units units Choisissez parmi ces types d'unité :
userSpace
userSpaceOnUse
objectBoundingBox
color x,y method Choisissez parmi ces types de méthode :
point
replace
floodfill
filltoborder
reset
compliance type Choisissez parmi ces types de conformité : MVG ou SVG
decorate type Choisissez parmi ces types de décoration :
none
line-through
overline
underline
ellipse centerx,centery radiusx,radiusy arcstart,arcstop
fill color Choisissez parmi l'une de ces couleurs.
fill-opacity opacity L'opacité varie de 0.0 (totalement transparent) à 1.0 (totalement opaque) ou sous forme de pourcentage (par ex. 50%).
fill-rule rule Choisissez parmi ces types de règle :
evenodd
nonzero
font name
font-family family
font-size point-size
font-stretch type Choisissez parmi ces types d'étirement :
all
normal
ultra-condensed
extra-condensed
condensed
semi-condensed
semi-expanded
expanded
extra-expanded
ultra-expanded
font-style style Choisissez parmi ces styles :
all
normal
italic
oblique
font-weight weight Choisissez parmi ces graisses :
all
normal
bold
100
200
300
400
500
600
700
800
900
gradient-units units Choisissez parmi ces unités :
userSpace
userSpaceOnUse
objectBoundingBox
gravity type Choisissez parmi ces types de gravity :
NorthWest
North
NorthEast
West
Center
East
SouthWest
South
SouthEast
image compose x,y width,height 'filename' Choisissez parmi ces opérations de composition :
MéthodeDescription
clearLa couleur et l'alpha de la destination sont tous deux effacés. Ni la source ni la destination ne sont utilisées en entrée.
srcLa source est copiée vers la destination. La destination n'est pas utilisée en entrée.
dstLa destination reste intacte.
src-over La source est composée par-dessus la destination.
dst-overLa destination est composée par-dessus la source et le résultat remplace la destination.
src-inLa partie de la source située à l'intérieur de la destination remplace la destination.
dst-inLa partie de la destination située à l'intérieur de la source remplace la destination.
src-outLa partie de la source située à l'extérieur de la destination remplace la destination.
dst-outLa partie de la destination située à l'extérieur de la source remplace la destination.
src-atopLa partie de la source située à l'intérieur de la destination est composée sur la destination.
dst-atopLa partie de la destination située à l'intérieur de la source est composée par-dessus la source et remplace la destination.
multiplyLa source est multipliée par la destination et remplace la destination. La couleur résultante est toujours au moins aussi sombre que l'une ou l'autre des deux couleurs constituantes. Multiplier n'importe quelle couleur par du noir produit du noir. Multiplier n'importe quelle couleur par du blanc laisse la couleur d'origine inchangée.
screenLa source et la destination sont complémentées puis multipliées, puis remplacent la destination. La couleur résultante est toujours au moins aussi claire que l'une ou l'autre des deux couleurs constituantes. Appliquer un screen sur n'importe quelle couleur avec du blanc produit du blanc. Appliquer un screen avec du noir laisse la couleur d'origine inchangée.
overlayMultiplie ou applique un screen sur les couleurs, selon la couleur de la destination. Les couleurs de la source recouvrent la destination tout en préservant ses hautes lumières et ses ombres. La couleur de la destination n'est pas remplacée, mais mélangée à la couleur de la source pour refléter la luminosité ou l'obscurité de la destination.
darkenSélectionne la plus sombre des couleurs de la destination et de la source. La destination est remplacée par la source lorsque la source est plus sombre, sinon elle reste inchangée.
lightenSélectionne la plus claire des couleurs de la destination et de la source. La destination est remplacée par la source lorsque la source est plus claire, sinon elle reste inchangée.
linear-lightAugmente légèrement le contraste avec un impact sur les valeurs tonales du premier plan.
color-dodgeÉclaircit la couleur de la destination pour refléter la couleur de la source. Peindre avec du noir ne produit aucun changement.
color-burnAssombrit la couleur de la destination pour refléter la couleur de la source. Peindre avec du blanc ne produit aucun changement.
hard-lightMultiplie ou applique un screen sur les couleurs, selon la valeur de la couleur de la source. Si la couleur de la source est plus claire que 0.5, la destination est éclaircie comme si elle était soumise à un screen. Si la couleur de la source est plus sombre que 0.5, la destination est assombrie, comme si elle était multipliée. Le degré d'éclaircissement ou d'assombrissement est proportionnel à la différence entre la couleur de la source et 0.5. Si elle est égale à 0.5, la destination reste inchangée. Peindre en noir ou blanc pur produit du noir ou du blanc.
soft-lightAssombrit ou éclaircit les couleurs, selon la valeur de la couleur de la source. Si la couleur de la source est plus claire que 0.5, la destination est éclaircie. Si la couleur de la source est plus sombre que 0.5, la destination est assombrie, comme si elle était brûlée. Le degré d'assombrissement ou d'éclaircissement est proportionnel à la différence entre la couleur de la source et 0.5. Si elle est égale à 0.5, la destination reste inchangée. Peindre en noir ou blanc pur produit une zone nettement plus sombre ou plus claire, mais ne donne pas du noir ou du blanc pur.
plusLa source est ajoutée à la destination et remplace la destination. Cet opérateur est utile pour animer un fondu entre deux images.
addComme pour 'plus' mais les données de transparence sont traitées comme des valeurs de masque (matte). Ainsi, toute zone transparente dans l'une ou l'autre image reste transparente.
minusSoustrait les couleurs de l'image source à l'image de destination. Lorsque la transparence est impliquée, les zones opaques sont soustraites de toute zone opaque de la destination.
subtractSoustrait les couleurs de l'image source à l'image de destination. Lorsque la transparence est impliquée, les zones transparentes sont soustraites, de sorte que seules les zones opaques de la source restent opaques dans l'image de destination.
differenceSoustrait la plus sombre des deux couleurs constituantes de la plus claire. Peindre avec du blanc inverse la couleur de la destination. Peindre avec du noir ne produit aucun changement.
exclusionProduit un effet similaire à celui de 'difference', mais apparaît avec un contraste plus faible. Peindre avec du blanc inverse la couleur de la destination. Peindre avec du noir ne produit aucun changement.
xorLa partie de la source située en dehors de la destination est combinée avec la partie de la destination située en dehors de la source.
copy-*Copie le canal spécifié de l'image source vers le même canal de l'image de destination. Si le canal spécifié n'existe pas dans l'image source (ce qui ne peut se produire que pour les méthodes 'copy-opacity' ou 'copy-black'), on suppose alors que l'image source est une image de canal spécial en niveaux de gris contenant les valeurs à copier.
change-maskRemplace par de la transparence tout pixel de destination semblable au pixel de l'image source (tel que défini par le facteur -fuzz actuel).
interline-spacing pixels
interword-spacing pixels
kerning pixels
line x,y x1,y1
matte x,y method Choisissez parmi ces méthodes :
point
replace
floodfill
filltoborder
reset
offset offset
opacity opacity Utilisez un pourcentage (par ex. 50%).
path path
point x,y
polygon x,y x1,y1, ..., xn,yn
polyline x,y x1,y1, ..., xn,yn
pop clip-path
pop defs
pop gradient
pop graphic-context
pop pattern
push clip-path "name"
push defs
push gradient id linear x,y x1,y1
push gradient id radial xc,cy xf,yf radius
push graphic-context { "id" } l'id est facultatif
push pattern id x,y width,height
rectangle x,y x1,y1
rotate angle
roundrectangle x,y x1,y1 width,height
scale x,y
skewX angle
skewX angle
stop-color color offset
stroke color
stroke-antialias 0 • 1
stroke-dasharray none • numeric-list
stroke-dashoffset offset
stroke-linecap type Choisissez parmi ces types de cap :
butt
round
square
stroke-linejoin type Choisissez parmi ces types de join :
bevel
miter
round
stroke-miterlimit limit
stroke-opacity opacity L'opacité varie de 0.0 (totalement transparent) à 1.0 (totalement opaque) ou sous forme de pourcentage (par ex. 50%).
stroke-width width
text "text"
text-antialias 0 • 1
text-undercolor color
translate x,y
use "url(#id)"
viewbox x,y x1,y1

Notez que les primitives sont sensibles à la casse, par ex. utilisez viewbox, et non viewBox.