⚠️ 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/).

MVG (Magick Vector Graphics)

Présentation de MVGPrimitives 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 :

affine sx,rx,ry,sy,tx,ty

arc x0,y0 x1,y1 a0,a1

bezier x0,y0 ... xn,yn

La courbe de Bézier (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éthode Description
clear La 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.
src La source est copiée vers la destination. La destination n'est pas utilisée en entrée.
dst La destination reste intacte.
src-over La source est composée par-dessus la destination.
dst-over La destination est composée par-dessus la source et le résultat remplace la destination.
src-in La partie de la source située à l'intérieur de la destination remplace la destination.
dst-in La partie de la destination située à l'intérieur de la source remplace la destination.
src-out La partie de la source située à l'extérieur de la destination remplace la destination.
dst-out La partie de la destination située à l'extérieur de la source remplace la destination.
src-atop La partie de la source située à l'intérieur de la destination est composée sur la destination.
dst-atop La partie de la destination située à l'intérieur de la source est composée par-dessus la source et remplace la destination.
multiply La 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.
screen La 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.
overlay Multiplie 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.
darken Sé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.
lighten Sé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-light Augmente 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-burn Assombrit la couleur de la destination pour refléter la couleur de la source. Peindre avec du blanc ne produit aucun changement.
hard-light Multiplie 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-light Assombrit 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.
plus La source est ajoutée à la destination et remplace la destination. Cet opérateur est utile pour animer un fondu entre deux images.
add Comme 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.
minus Soustrait 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.
subtract Soustrait 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.
difference Soustrait 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.
exclusion Produit 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.
xor La 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-mask Remplace 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.