⚠️ Este é um site de tradução não oficial, sem relação com a ImageMagick Studio LLC. Para informações oficiais, consulte a página original (https://imagemagick.org/magick-vector-graphics/).

MVG (Magick Vector Graphics)

Visão Geral do MVGPrimitivas de Desenho

Esta especificação define os recursos e a sintaxe do Magick Vector Graphics (MVG), uma linguagem modularizada para descrever gráficos vetoriais bidimensionais e gráficos mistos vetoriais/rasterizados no ImageMagick. Você pode usar a linguagem para desenhar a partir da linha de comando, de um arquivo MVG, de um arquivo SVG -- Scalable Vector Graphics ou de uma das interfaces de programa do ImageMagick. Use este comando, por exemplo, para renderizar um 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

e este é o resultado:

arc

Quando o desenho fica suficientemente complexo, recomendamos reunir as primitivas gráficas em um arquivo MVG. Para nosso exemplo, 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 um gráfico de pizza com este comando:

magick mvg:piechart.mvg piechart.png

que produz esta renderização:

piechart

No entanto, em geral, o MVG é suficientemente difícil de manusear, de modo que você provavelmente vai querer usar um programa para gerar seus gráficos no formato SVG. O ImageMagick converte automagicamente SVG em MVG e renderiza sua imagem; por exemplo, renderizamos piechart.svg com este comando:

magick mvg:piechart.svg piechart.jpg

para produzir o mesmo gráfico de pizza que criamos com a linguagem MVG.

O desenho também está disponível a partir de muitas das interfaces de programa do ImageMagick. O ImageMagick converte as chamadas da API de desenho em MVG e o renderiza. Aqui está um exemplo de código escrito na linguagem 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);

Visão Geral do MVG

O MVG ignora todos os espaços em branco entre comandos. Isso permite múltiplos comandos MVG por linha. É convenção comum encerrar cada comando MVG com uma quebra de linha para tornar o MVG mais fácil de editar e ler. Esta descrição de sintaxe usa indentação nas sequências MVG para ajudar na compreensão. A indentação é suportada, mas não é obrigatória.

Sintaxe do wrapper de metarquivo (para dar suporte a arquivos MVG autônomos):

push graphic-context
  viewbox 0 0 width height
  [ any other MVG commands ]
pop graphic-context

Sintaxe de padrão (salvando e restaurando o contexto):

push pattern id x,y width,height
 push graphic-context
  [ drawing commands ]
 pop graphic-context
pop pattern

um exemplo é (%s é uma string 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 o lado a lado (tiling) de imagens use:

push pattern id x,y width,height
 image Copy ...
pop pattern

Observe que você pode usar o padrão tanto para o fill quanto para o stroke, assim:

stroke url(#%s)

ou

fill url(#%s)

O clip path define uma área de recorte, na qual somente a área contida será desenhada. As áreas fora da área de recorte são mascaradas.

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 Desenho

Aqui está uma descrição completa das primitivas de desenho do MVG:

affine sx,rx,ry,sy,tx,ty

arc x0,y0 x1,y1 a0,a1

bezier x0,y0 ... xn,yn

A bézier (spline) requer três ou mais coordenadas x,y para definir sua forma. O primeiro e o último ponto são os nós (coordenadas preservadas) e quaisquer coordenadas intermediárias são os pontos de controle. Se dois pontos de controle forem especificados, a linha entre cada nó de extremidade e seu ponto de controle sequencialmente correspondente determina a direção tangente da curva naquela extremidade. Se um ponto de controle for especificado, as linhas dos nós de extremidade até o único ponto de controle determinam as direções tangentes da curva em cada extremidade. Se mais de dois pontos de controle forem especificados, então os pontos de controle adicionais atuam em combinação para determinar a forma intermediária da curva. Para desenhar curvas complexas, é altamente recomendável usar a primitiva Path ou desenhar múltiplos segmentos de bézier de quatro pontos, com os nós inicial e final de cada segmento sucessivo repetidos.

border-color color

circle originx,originy perimeterx,perimetery

clip-path url(name)

clip-rule rule

Escolha entre estes tipos de regra:

evenodd
nonzero

clip-units units

Escolha entre estes tipos de unidade:

userSpace
userSpaceOnUse
objectBoundingBox

color x,y method

Escolha entre estes tipos de método:

point
replace
floodfill
filltoborder
reset

compliance type

Escolha entre estes tipos de conformidade: MVG ou SVG

decorate type

Escolha entre estes tipos de decoração:

none
line-through
overline
underline

ellipse centerx,centery radiusx,radiusy arcstart,arcstop

fill color

Escolha entre qualquer uma destas cores.

fill-opacity opacity

A opacidade varia de 0.0 (totalmente transparente) a 1.0 (totalmente opaco) ou como porcentagem (por exemplo, 50%).

fill-rule rule

Escolha entre estes tipos de regra:

evenodd
nonzero

font name

font-family family

font-size point-size

font-stretch type

Escolha entre estes tipos de stretch:

all
normal
ultra-condensed
extra-condensed
condensed
semi-condensed
semi-expanded
expanded
extra-expanded
ultra-expanded

font-style style

Escolha entre estes estilos:

all
normal
italic
oblique

font-weight weight

Escolha entre estes pesos:

all
normal
bold
100
200
300
400
500
600
700
800
900

gradient-units units

Escolha entre estas unidades:

userSpace
userSpaceOnUse
objectBoundingBox

gravity type

Escolha entre estes tipos de gravity:

NorthWest
North
NorthEast
West
Center
East
SouthWest
South
SouthEast

image compose x,y width,height 'filename'

Escolha entre estas operações de composição:

Método Descrição
clear Tanto a cor quanto o alfa do destino são limpos. Nem a origem nem o destino são usados como entrada.
src A origem é copiada para o destino. O destino não é usado como entrada.
dst O destino é deixado intocado.
src-over A origem é composta sobre o destino.
dst-over O destino é composto sobre a origem e o resultado substitui o destino.
src-in A parte da origem situada dentro do destino substitui o destino.
dst-in A parte do destino situada dentro da origem substitui o destino.
src-out A parte da origem situada fora do destino substitui o destino.
dst-out A parte do destino situada fora da origem substitui o destino.
src-atop A parte da origem situada dentro do destino é composta sobre o destino.
dst-atop A parte do destino situada dentro da origem é composta sobre a origem e substitui o destino.
multiply A origem é multiplicada pelo destino e substitui o destino. A cor resultante é sempre pelo menos tão escura quanto qualquer uma das duas cores constituintes. Multiplicar qualquer cor por preto produz preto. Multiplicar qualquer cor por branco deixa a cor original inalterada.
screen A origem e o destino são complementados e então multiplicados, substituindo o destino. A cor resultante é sempre pelo menos tão clara quanto qualquer uma das duas cores constituintes. Aplicar screen a qualquer cor com branco produz branco. Aplicar screen a qualquer cor com preto deixa a cor original inalterada.
overlay Multiplica ou aplica screen às cores, dependendo da cor de destino. As cores de origem sobrepõem o destino preservando seus realces e sombras. A cor de destino não é substituída, mas é misturada com a cor de origem para refletir a clareza ou escuridão do destino.
darken Seleciona a mais escura entre as cores de destino e de origem. O destino é substituído pela origem quando a origem é mais escura, caso contrário permanece inalterado.
lighten Seleciona a mais clara entre as cores de destino e de origem. O destino é substituído pela origem quando a origem é mais clara, caso contrário permanece inalterado.
linear-light Aumenta ligeiramente o contraste, com impacto nos valores tonais do primeiro plano.
color-dodge Clareia a cor de destino para refletir a cor de origem. Pintar com preto não produz alteração.
color-burn Escurece a cor de destino para refletir a cor de origem. Pintar com branco não produz alteração.
hard-light Multiplica ou aplica screen às cores, dependendo do valor da cor de origem. Se a cor de origem for mais clara que 0.5, o destino é clareado como se tivesse recebido screen. Se a cor de origem for mais escura que 0.5, o destino é escurecido como se tivesse sido multiplicado. O grau de clareamento ou escurecimento é proporcional à diferença entre a cor de origem e 0.5. Se for igual a 0.5, o destino permanece inalterado. Pintar com preto ou branco puros produz preto ou branco.
soft-light Escurece ou clareia as cores, dependendo do valor da cor de origem. Se a cor de origem for mais clara que 0.5, o destino é clareado. Se a cor de origem for mais escura que 0.5, o destino é escurecido, como se tivesse sido queimado. O grau de escurecimento ou clareamento é proporcional à diferença entre a cor de origem e 0.5. Se for igual a 0.5, o destino permanece inalterado. Pintar com preto ou branco puros produz uma área nitidamente mais escura ou mais clara, mas não resulta em preto ou branco puros.
plus A origem é adicionada ao destino e substitui o destino. Este operador é útil para animar uma dissolução entre duas imagens.
add Como em 'plus', mas os dados de transparência são tratados como valores de matte. Assim, quaisquer áreas transparentes em qualquer das imagens permanecem transparentes.
minus Subtrai as cores da imagem de origem da imagem de destino. Quando há transparência envolvida, as áreas opacas serão subtraídas de quaisquer áreas opacas do destino.
subtract Subtrai as cores da imagem de origem da imagem de destino. Quando há transparência envolvida, as áreas transparentes são subtraídas, de modo que apenas as áreas opacas da origem permanecem opacas na imagem de destino.
difference Subtrai a mais escura das duas cores constituintes da mais clara. Pintar com branco inverte a cor de destino. Pintar com preto não produz alteração.
exclusion Produz um efeito semelhante ao de 'difference', mas aparece com menor contraste. Pintar com branco inverte a cor de destino. Pintar com preto não produz alteração.
xor A parte da origem situada fora do destino é combinada com a parte do destino situada fora da origem.
copy-* Copia o canal especificado na imagem de origem para o mesmo canal na imagem de destino. Se o canal especificado na imagem de origem não existir (o que só pode acontecer para os métodos 'copy-opacity' ou 'copy-black'), assume-se que a imagem de origem é uma imagem especial de canal em tons de cinza com os valores a serem copiados.
change-mask Substitui por transparência qualquer pixel de destino que seja semelhante ao pixel da imagem de origem (conforme definido pelo fator -fuzz atual).

interline-spacing pixels

interword-spacing pixels

kerning pixels

line x,y x1,y1

matte x,y method

Escolha entre estes métodos:

point
replace
floodfill
filltoborder
reset

offset offset

opacity opacity

Use porcentagem (por exemplo, 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" }

o id é 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

Escolha entre estes tipos de cap:

butt
round
square

stroke-linejoin type

Escolha entre estes tipos de join:

bevel
miter
round

stroke-miterlimit limit

stroke-opacity opacity

A opacidade varia de 0.0 (totalmente transparente) a 1.0 (totalmente opaco) ou como porcentagem (por exemplo, 50%).

stroke-width width

text "text"

text-antialias 0 • 1

text-undercolor color

translate x,y

use "url(#id)"

viewbox x,y x1,y1

Observe que as primitivas diferenciam maiúsculas de minúsculas; por exemplo, use viewbox, não viewBox.