⚠️ Este es un sitio de traducción no oficial, sin relación con ImageMagick Studio LLC. Para información autorizada, consulte la página original (https://imagemagick.org/magick-vector-graphics/).

MVG (Magick Vector Graphics)

Descripción general de MVGPrimitivas 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:

arc

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:

piechart

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.