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

Magick Vector Graphics

Visão Geral do MVG • Primitivas 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:

Primitiva Descrição
affine sx,rx,ry,sy,tx,ty
arc x0,y0 x1,y1 a0,a1
bezier x0,y0 ... xn,yn A Bezier (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étodoDescrição
clearTanto a cor quanto o alfa do destino são limpos. Nem a origem nem o destino são usados como entrada.
srcA origem é copiada para o destino. O destino não é usado como entrada.
dstO destino é deixado intocado.
src-over A origem é composta sobre o destino.
dst-overO destino é composto sobre a origem e o resultado substitui o destino.
src-inA parte da origem situada dentro do destino substitui o destino.
dst-inA parte do destino situada dentro da origem substitui o destino.
src-outA parte da origem situada fora do destino substitui o destino.
dst-outA parte do destino situada fora da origem substitui o destino.
src-atopA parte da origem situada dentro do destino é composta sobre o destino.
dst-atopA parte do destino situada dentro da origem é composta sobre a origem e substitui o destino.
multiplyA 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.
screenA 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.
overlayMultiplica 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.
darkenSeleciona 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.
lightenSeleciona 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-lightAumenta ligeiramente o contraste, com impacto nos valores tonais do primeiro plano.
color-dodgeClareia a cor de destino para refletir a cor de origem. Pintar com preto não produz alteração.
color-burnEscurece a cor de destino para refletir a cor de origem. Pintar com branco não produz alteração.
hard-lightMultiplica 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-lightEscurece 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.
plusA origem é adicionada ao destino e substitui o destino. Este operador é útil para animar uma dissolução entre duas imagens.
addComo 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.
minusSubtrai 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.
subtractSubtrai 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.
differenceSubtrai 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.
exclusionProduz 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.
xorA 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-maskSubstitui 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.