MVG (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. Puedes 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. Usa 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 prefieras usar un programa que genere tus gráficos en formato SVG. ImageMagick convierte automáticamente SVG a MVG y renderiza tu 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í tienes 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
Ten en cuenta que puedes 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í tienes una descripción completa de las primitivas de dibujo de MVG:
affine sx,rx,ry,sy,tx,ty
arc x0,y0 x1,y1 a0,a1
bezier x0,y0 ... xn,yn
La curva Bézier (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
Elige entre estos tipos de regla:
evenodd
nonzero
clip-units units
Elige entre estos tipos de unidad:
userSpace
userSpaceOnUse
objectBoundingBox
color x,y method
Elige entre estos tipos de método:
point
replace
floodfill
filltoborder
reset
compliance type
Elige entre estos tipos de conformidad: MVG o SVG
decorate type
Elige entre estos tipos de decoración:
none
line-through
overline
underline
ellipse centerx,centery radiusx,radiusy arcstart,arcstop
fill color
Elige 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
Elige entre estos tipos de regla:
evenodd
nonzero
font name
font-family family
font-size point-size
font-stretch type
Elige entre estos tipos de estiramiento:
all
normal
ultra-condensed
extra-condensed
condensed
semi-condensed
semi-expanded
expanded
extra-expanded
ultra-expanded
font-style style
Elige entre estos estilos:
all
normal
italic
oblique
font-weight weight
Elige entre estos pesos:
all
normal
bold
100
200
300
400
500
600
700
800
900
gradient-units units
Elige entre estas unidades:
userSpace
userSpaceOnUse
objectBoundingBox
gravity type
Elige entre estos tipos de gravity:
NorthWest
North
NorthEast
West
Center
East
SouthWest
South
SouthEast
image compose x,y width,height 'filename'
Elige entre estas operaciones de composición:
| Método | Descripción |
|---|---|
| clear | Tanto el color como el alfa del destino se borran. Ni el origen ni el destino se usan como entrada. |
| src | El origen se copia en el destino. El destino no se usa como entrada. |
| dst | El destino se deja intacto. |
| src-over | El origen se compone sobre el destino. |
| dst-over | El destino se compone sobre el origen y el resultado reemplaza al destino. |
| src-in | La parte del origen que queda dentro del destino reemplaza al destino. |
| dst-in | La parte del destino que queda dentro del origen reemplaza al destino. |
| src-out | La parte del origen que queda fuera del destino reemplaza al destino. |
| dst-out | La parte del destino que queda fuera del origen reemplaza al destino. |
| src-atop | La parte del origen que queda dentro del destino se compone sobre el destino. |
| dst-atop | La parte del destino que queda dentro del origen se compone sobre el origen y reemplaza al destino. |
| multiply | El origen se multiplica por el destino y reemplaza al destino. El color resultante es siempre al menos tan oscuro como cualquiera de los dos colores constituyentes. Multiplicar cualquier color por negro produce negro. Multiplicar cualquier color por blanco deja el color original sin cambios. |
| screen | El origen y el destino se complementan, luego se multiplican y después reemplazan al destino. El color resultante es siempre al menos tan claro como cualquiera de los dos colores constituyentes. Aplicar screen a cualquier color con blanco produce blanco. Aplicar screen a cualquier color con negro deja el color original sin cambios. |
| overlay | Multiplica o aplica screen a los colores, según el color del destino. Los colores del origen recubren el destino conservando sus luces y sombras. El color del destino no se reemplaza, sino que se mezcla con el color del origen para reflejar la claridad u oscuridad del destino. |
| darken | Selecciona el más oscuro de los colores de destino y de origen. El destino se reemplaza con el origen cuando el origen es más oscuro; de lo contrario, se deja sin cambios. |
| lighten | Selecciona el más claro de los colores de destino y de origen. El destino se reemplaza con el origen cuando el origen es más claro; de lo contrario, se deja sin cambios. |
| linear-light | Aumenta ligeramente el contraste con un impacto en los valores tonales del primer plano. |
| color-dodge | Aclara el color del destino para reflejar el color del origen. Pintar con negro no produce cambios. |
| color-burn | Oscurece el color del destino para reflejar el color del origen. Pintar con blanco no produce cambios. |
| hard-light | Multiplica o aplica screen a los colores, según el valor del color del origen. Si el color del origen es más claro que 0.5, el destino se aclara como si se le aplicara screen. Si el color del origen es más oscuro que 0.5, el destino se oscurece, como si se multiplicara. El grado de aclarado u oscurecimiento es proporcional a la diferencia entre el color del origen y 0.5. Si es igual a 0.5, el destino no cambia. Pintar con negro o blanco puros produce negro o blanco. |
| soft-light | Oscurece o aclara los colores, según el valor del color del origen. Si el color del origen es más claro que 0.5, el destino se aclara. Si el color del origen es más oscuro que 0.5, el destino se oscurece, como si se sobreexpusiera (burn). El grado de oscurecimiento o aclarado es proporcional a la diferencia entre el color del origen y 0.5. Si es igual a 0.5, el destino no cambia. Pintar con negro o blanco puros produce un área claramente más oscura o más clara, pero no da como resultado negro o blanco puros. |
| plus | El origen se suma al destino y reemplaza al destino. Este operador es útil para animar una disolución entre dos imágenes. |
| add | Igual que 'plus', pero los datos de transparencia se tratan como valores de mate. Por ello, cualquier área transparente en cualquiera de las imágenes permanece transparente. |
| minus | Resta los colores de la imagen de origen de la imagen de destino. Cuando hay transparencia involucrada, las áreas opacas se restarán de cualquier área opaca del destino. |
| subtract | Resta los colores de la imagen de origen de la imagen de destino. Cuando hay transparencia involucrada, las áreas transparentes se restan, de modo que solo las áreas opacas del origen permanecen opacas en la imagen de destino. |
| difference | Resta el más oscuro de los dos colores constituyentes del más claro. Pintar con blanco invierte el color del destino. Pintar con negro no produce cambios. |
| exclusion | Produce un efecto similar al de 'difference', pero aparece con menor contraste. Pintar con blanco invierte el color del destino. Pintar con negro no produce cambios. |
| xor | La parte del origen que queda fuera del destino se combina con la parte del destino que queda fuera del origen. |
| copy-* | Copia el canal especificado de la imagen de origen al mismo canal de la imagen de destino. Si el canal especificado en la imagen de origen no existe (lo cual solo puede ocurrir con los métodos 'copy-opacity' o 'copy-black'), entonces se asume que la imagen de origen es una imagen de canal especial en escala de grises con los valores que se van a copiar. |
| change-mask | Reemplaza con transparencia cualquier píxel del destino que sea similar al píxel de la imagen de origen (según lo definido por el factor -fuzz actual). |
interline-spacing pixels
interword-spacing pixels
kerning pixels
line x,y x1,y1
matte x,y method
Elige entre estos métodos:
point
replace
floodfill
filltoborder
reset
offset offset
opacity opacity
Usa 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
Elige entre estos tipos de extremo (cap):
butt
round
square
stroke-linejoin type
Elige entre estos tipos de unión (join):
bevel
miter
round
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
Ten en cuenta que las primitivas distinguen mayúsculas y minúsculas; por ejemplo, usa viewbox, no viewBox.

