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

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:

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 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:
evenodd
nonzero
clip-units units Elija entre estos tipos de unidad:
userSpace
userSpaceOnUse
objectBoundingBox
color x,y method Elija entre estos tipos de método:
point
replace
floodfill
filltoborder
reset
compliance type Elija entre estos tipos de conformidad: MVG o SVG
decorate type Elija entre estos tipos de decoración:
none
line-through
overline
underline
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:
evenodd
nonzero
font name
font-family family
font-size point-size
font-stretch type Elija entre estos tipos de estiramiento:
all
normal
ultra-condensed
extra-condensed
condensed
semi-condensed
semi-expanded
expanded
extra-expanded
ultra-expanded
font-style style Elija entre estos estilos:
all
normal
italic
oblique
font-weight weight Elija entre estos pesos:
all
normal
bold
100
200
300
400
500
600
700
800
900
gradient-units units Elija entre estas unidades:
userSpace
userSpaceOnUse
objectBoundingBox
gravity type Elija entre estos tipos de gravity:
NorthWest
North
NorthEast
West
Center
East
SouthWest
South
SouthEast
image compose x,y width,height 'filename' Elija entre estas operaciones de composición:
MétodoDescripción
clearTanto el color como el alfa del destino se borran. Ni el origen ni el destino se usan como entrada.
srcEl origen se copia en el destino. El destino no se usa como entrada.
dstEl destino se deja intacto.
src-over El origen se compone sobre el destino.
dst-overEl destino se compone sobre el origen y el resultado reemplaza al destino.
src-inLa parte del origen que queda dentro del destino reemplaza al destino.
dst-inLa parte del destino que queda dentro del origen reemplaza al destino.
src-outLa parte del origen que queda fuera del destino reemplaza al destino.
dst-outLa parte del destino que queda fuera del origen reemplaza al destino.
src-atopLa parte del origen que queda dentro del destino se compone sobre el destino.
dst-atopLa parte del destino que queda dentro del origen se compone sobre el origen y reemplaza al destino.
multiplyEl 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.
screenEl 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.
overlayMultiplica 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.
darkenSelecciona 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.
lightenSelecciona 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-lightAumenta ligeramente el contraste con un impacto en los valores tonales del primer plano.
color-dodgeAclara el color del destino para reflejar el color del origen. Pintar con negro no produce cambios.
color-burnOscurece el color del destino para reflejar el color del origen. Pintar con blanco no produce cambios.
hard-lightMultiplica 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-lightOscurece 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.
plusEl origen se suma al destino y reemplaza al destino. Este operador es útil para animar una disolución entre dos imágenes.
addIgual 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.
minusResta 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.
subtractResta 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.
differenceResta 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.
exclusionProduce 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.
xorLa 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-maskReemplaza 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 Elija entre estos métodos:
point
replace
floodfill
filltoborder
reset
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):
butt
round
square
stroke-linejoin type Elija 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

Tenga en cuenta que las primitivas distinguen mayúsculas y minúsculas; por ejemplo, use viewbox, no viewBox.