本规范定义了 Magick 矢量图形 (MVG) 的功能和语法,MVG 是一种模块化的语言,用于在 ImageMagick 中描述二维矢量和混合矢量/光栅图形。您可以使用该语言从命令行、MVG 文件、SVG - 可缩放矢量图形 文件或 ImageMagick 的 程序接口 之一进行绘图。例如,使用以下命令渲染弧形
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
以下是结果
当绘图变得足够复杂时,建议您将图形基元组装成 MVG 文件。对于我们的示例,我们使用 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
使用以下命令渲染饼图
magick mvg:piechart.mvg piechart.png
这将生成以下渲染结果
但是,总的来说,MVG 很难使用,因此您可能需要使用程序以 SVG 格式生成图形。ImageMagick 会自动将 SVG 转换为 MVG 并渲染您的图像,例如,我们使用以下命令渲染 piechart.svg
magick mvg:piechart.svg piechart.jpg
以生成与使用 MVG 语言创建的相同的饼图。
许多 ImageMagick 程序接口 也提供绘图功能。ImageMagick 会将绘图 API 调用转换为 MVG 并进行渲染。以下是在 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);
MVG 概述
MVG 会忽略命令之间的所有空白。这允许每行包含多个 MVG 命令。通常会在每个 MVG 命令末尾添加一个换行符,以便更轻松地编辑和阅读 MVG。此语法说明在 MVG 序列中使用缩进来帮助理解。缩进受支持,但不是必需的。
元文件包装器语法(用于支持独立 MVG 文件)
push graphic-context viewbox 0 0 width height [ any other MVG commands ] pop graphic-context
模式语法(保存和恢复上下文)
push pattern id x,y width,height push graphic-context [ drawing commands ] pop graphic-context pop pattern
示例为(%s 是一个标识符字符串)
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
对于图像平铺,请使用
push pattern id x,y width,height image Copy ... pop pattern
请注意,您可以将模式用于填充或描边,例如
stroke url(#%s)
或者
fill url(#%s)
裁剪路径定义一个裁剪区域,其中仅绘制包含的区域。裁剪区域之外的区域被遮罩。
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)
绘图基元
以下是 MVG 绘图基元的完整说明
基元 | 描述 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
affine sx,rx,ry,sy,tx,ty | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
arc x0,y0 x1,y1 a0,a1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bezier x0,y0 ... xn,yn | Bezier(样条曲线)需要三个或更多 x,y 坐标来定义其形状。第一个和最后一个点是节点(保留坐标),任何中间坐标都是控制点。如果指定两个控制点,则每个结束节点与其顺序上相应的控制点之间的线段决定了该端点处曲线的切线方向。如果指定一个控制点,则从结束节点到一个控制点的线段决定了每个端点处曲线的切线方向。如果指定两个以上的控制点,则额外的控制点会共同作用来确定曲线的中间形状。为了绘制复杂的曲线,强烈建议使用 Path 基元或绘制多个具有重复的起始和结束节点的四点贝塞尔段。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
border-color color | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
circle originx,originy perimeterx,perimetery | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
clip-path url(name) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
clip-rule rule | 从以下规则类型中选择evenodd nonzero |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
clip-units units | 从以下单位类型中选择userSpace userSpaceOnUse objectBoundingBox |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
color x,y method | 从以下方法类型中选择point replace floodfill filltoborder reset |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
compliance type | 从以下合规性类型中选择:MVG 或 SVG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
decorate type | 从以下装饰类型中选择none line-through overline underline |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
ellipse centerx,centery radiusx,radiusy arcstart,arcstop | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fill color | 从以下 颜色 中选择。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fill-opacity opacity | 不透明度范围从 0.0(完全透明)到 1.0(完全不透明),或者以百分比表示(例如 50%)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fill-rule rule | 从以下规则类型中选择evenodd nonzero |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font name | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-family family | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-size point-size | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-stretch type | 从以下拉伸类型中选择all normal ultra-condensed extra-condensed condensed semi-condensed semi-expanded expanded extra-expanded ultra-expanded |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-style style | 从以下样式中选择all normal italic oblique |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
font-weight weight | 从以下粗细中选择all normal bold 100 200 300 400 500 600 700 800 900 |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gradient-units units | 从以下单位中选择userSpace userSpaceOnUse objectBoundingBox |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
gravity type | 从以下重心类型中选择NorthWest North NorthEast West Center East SouthWest South SouthEast |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
image compose x,y width,height 'filename' | 从以下合成操作中选择
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interline-spacing pixels | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
interword-spacing pixels | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
kerning pixels | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
line x,y x1,y1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
matte x,y method | 从以下方法中选择point replace floodfill filltoborder reset |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
offset offset | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
opacity opacity | 使用百分比(例如 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" } | id 为可选参数 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
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 | 从以下帽型中选择butt round square |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stroke-linejoin type | 从以下连接类型中选择bevel miter round |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stroke-miterlimit limit | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stroke-opacity opacity | 不透明度范围从 0.0(完全透明)到 1.0(完全不透明),或者以百分比表示(例如 50%)。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stroke-width width | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
text "text" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
text-antialias 0 • 1 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
text-undercolor color | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
translate x,y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
use "url(#id)" | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
viewbox x,y x1,y1 |
注意,这些原语区分大小写,例如,使用 viewbox
而不是 viewBox
。