Magick Vector Graphics
Descripción general de MVG • Primitivas de dibujo
Esta especificación define las características y la sintaxis de Magick Vector Graphics (MVG), un lenguaje modularizado para describir gráficos vectoriales bidimensionales y mixtos vectoriales/rasterizados en ImageMagick. Puede usar el lenguaje para dibujar desde la línea de comandos, desde un archivo MVG, desde un archivo SVG (Scalable Vector Graphics) o desde una de las interfaces de programa de ImageMagick. Use este comando, por ejemplo, para renderizar un arco:
$ 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
y este es el resultado:
Cuando el dibujo se vuelve suficientemente complejo, recomendamos reunir las primitivas gráficas en un archivo MVG. Para nuestro ejemplo, usamos 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
para renderizar un gráfico circular con este comando:
$ magick mvg:piechart.mvg piechart.png
que produce esta representación:
Sin embargo, en general, MVG es suficientemente difícil de manejar como para que probablemente prefiera usar un programa que genere sus gráficos en formato SVG. ImageMagick convierte automáticamente SVG a MVG y renderiza su imagen; por ejemplo, renderizamos piechart.svg con este comando:
$ magick mvg:piechart.svg piechart.jpg
para producir el mismo gráfico circular que creamos con el lenguaje MVG.
El dibujo también está disponible desde muchas de las interfaces de programa de ImageMagick. ImageMagick convierte las llamadas a la API de dibujo a MVG y las renderiza. Aquí tiene un código de ejemplo escrito en el lenguaje 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);
Descripción general de MVG
MVG ignora todos los espacios en blanco entre comandos. Esto permite varios comandos MVG por línea. Es convención común terminar cada comando MVG con un salto de línea para facilitar la edición y lectura de MVG. Esta descripción de la sintaxis usa sangría en las secuencias MVG para facilitar la comprensión. La sangría es compatible, pero no obligatoria.
Sintaxis del envoltorio de metarchivo (para admitir archivos MVG independientes):
push graphic-context
viewbox 0 0 width height
[ any other MVG commands ]
pop graphic-context
Sintaxis de patrón (guardar y restaurar el contexto):
push pattern id x,y width,height
push graphic-context
[ drawing commands ]
pop graphic-context
pop pattern
un ejemplo es (%s es una cadena identificadora):
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
Para el mosaico de imágenes usa:
push pattern id x,y width,height
image Copy ...
pop pattern
Tenga en cuenta que puede usar el patrón tanto para el relleno (fill) como para el trazo (stroke), así:
stroke url(#%s)
o
fill url(#%s)
La ruta de recorte (clip path) define un área de recorte, donde solo se dibuja sobre el área contenida. Las áreas fuera del área de recorte quedan enmascaradas.
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)
Primitivas de dibujo
Aquí tiene una descripción completa de las primitivas de dibujo de MVG:
| Primitiva | Descripción | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| affine sx,rx,ry,sy,tx,ty | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| arc x0,y0 x1,y1 a0,a1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| bezier x0,y0 ... xn,yn | La primitiva Bezier (spline) requiere tres o más coordenadas x,y para definir su forma. El primer y el último punto son los nudos (coordenadas conservadas) y cualquier coordenada intermedia son los puntos de control. Si se especifican dos puntos de control, la línea entre cada nudo extremo y su punto de control respectivo correspondiente determina la dirección de la tangente de la curva en ese extremo. Si se especifica un punto de control, las líneas desde los nudos extremos hasta ese único punto de control determinan las direcciones tangentes de la curva en cada extremo. Si se especifican más de dos puntos de control, los puntos de control adicionales actúan en combinación para determinar la forma intermedia de la curva. Para dibujar curvas complejas, se recomienda encarecidamente usar la primitiva Path o dibujar varios segmentos Bézier de cuatro puntos repitiendo los nudos inicial y final de cada segmento sucesivo. |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| border-color color | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| circle originx,originy perimeterx,perimetery | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| clip-path url(name) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| clip-rule rule | Elija entre estos tipos de regla:evenoddnonzero |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| clip-units units | Elija entre estos tipos de unidad:userSpaceuserSpaceOnUseobjectBoundingBox |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| color x,y method | Elija entre estos tipos de método:pointreplacefloodfillfilltoborderreset |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| compliance type | Elija entre estos tipos de conformidad: MVG o SVG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| decorate type | Elija entre estos tipos de decoración:noneline-throughoverlineunderline |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ellipse centerx,centery radiusx,radiusy arcstart,arcstop | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fill color | Elija cualquiera de estos colores. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fill-opacity opacity | La opacidad va de 0.0 (totalmente transparente) a 1.0 (totalmente opaco) o como porcentaje (p. ej. 50%). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| fill-rule rule | Elija entre estos tipos de regla:evenoddnonzero |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| font name | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| font-family family | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| font-size point-size | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| font-stretch type | Elija entre estos tipos de estiramiento:allnormalultra-condensedextra-condensedcondensedsemi-condensedsemi-expandedexpandedextra-expandedultra-expanded |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| font-style style | Elija entre estos estilos:allnormalitalicoblique |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| font-weight weight | Elija entre estos pesos:allnormalbold100200300400500600700800900 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gradient-units units | Elija entre estas unidades:userSpaceuserSpaceOnUseobjectBoundingBox |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| gravity type | Elija entre estos tipos de gravity:NorthWestNorthNorthEastWestCenterEastSouthWestSouthSouthEast |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| image compose x,y width,height 'filename' | Elija entre estas operaciones de composición:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| interline-spacing pixels | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| interword-spacing pixels | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| kerning pixels | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| line x,y x1,y1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| matte x,y method | Elija entre estos métodos:pointreplacefloodfillfilltoborderreset |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| offset offset | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| opacity opacity | Use porcentaje (p. ej. 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" } | el id es opcional | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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 | Elija entre estos tipos de extremo (cap):buttroundsquare |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| stroke-linejoin type | Elija entre estos tipos de unión (join):bevelmiterround |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| stroke-miterlimit limit | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| stroke-opacity opacity | La opacidad va de 0.0 (totalmente transparente) a 1.0 (totalmente opaco) o como porcentaje (p. ej. 50%). | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| stroke-width width | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| text "text" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| text-antialias 0 • 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| text-undercolor color | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| translate x,y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| use "url(#id)" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| viewbox x,y x1,y1 |
Tenga en cuenta que las primitivas distinguen mayúsculas y minúsculas; por ejemplo, use viewbox, no viewBox.

