MVG (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:
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:
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.

