MVG (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 :
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 :
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.

