Color Modes

Magick 矢量图形

MVG 概述绘图基元

本规范定义了 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

以下是结果

    arc

当绘图变得足够复杂时,建议您将图形基元组装成 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

这将生成以下渲染结果

    piechart

但是,总的来说,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' 从以下合成操作中选择
方法 描述
clear 目标的颜色和 Alpha 都被清除。源和目标都不用作输入。
src 源被复制到目标。目标不用作输入。
dst 目标保持不变。
src-over 源在目标之上合成。
dst-over 目标在源之上合成,结果替换目标。
src-in 位于目标内部的源部分替换目标。
dst-in 位于源内部的目标部分替换目标。
src-out 位于目标外部的源部分替换目标。
dst-out 位于源外部的目标部分替换目标。
src-atop 位于目标内部的源部分在目标之上合成。
dst-atop 位于源内部的目标部分在源之上合成,结果替换目标。
multiply 源乘以目标,结果替换目标。所得颜色始终至少与两个组成颜色一样暗。任何颜色乘以黑色都将生成黑色。任何颜色乘以白色都将保留原始颜色。
screen 源和目标取反,然后相乘,结果替换目标。所得颜色始终至少与两个组成颜色一样亮。任何颜色与白色屏幕混合都将生成白色。任何颜色与黑色屏幕混合都将保留原始颜色。
overlay 根据目标颜色进行颜色相乘或屏幕混合。源颜色覆盖目标,同时保留其高光和阴影。目标颜色不会被替换,而是与源颜色混合以反映目标的亮度或暗度。
darken 选择目标和源颜色中较暗的颜色。当源颜色较暗时,目标将被源颜色替换,否则保持不变。
lighten 选择目标和源颜色中较亮的颜色。当源颜色较亮时,目标将被源颜色替换,否则保持不变。
linear-light 略微增加对比度,对前景的色调值有影响。
color-dodge 使目标颜色变亮以反映源颜色。用黑色绘制不会产生任何变化。
color-burn 使目标颜色变暗以反映源颜色。用白色绘制不会产生任何变化。
hard-light 根据源颜色值进行颜色相乘或屏幕混合。如果源颜色比 0.5 亮,则目标将变亮,如同进行屏幕混合一样。如果源颜色比 0.5 暗,则目标将变暗,如同进行相乘一样。变亮或变暗的程度与源颜色与 0.5 的差值成正比。如果它等于 0.5,则目标保持不变。用纯黑色或白色绘制将生成黑色或白色。
soft-light 使颜色变暗或变亮,根据源颜色值进行调整。如果源颜色比 0.5 亮,则目标将变亮。如果源颜色比 0.5 暗,则目标将变暗,如同进行淡入一样。变暗或变亮的程度与源颜色与 0.5 的差值成正比。如果它等于 0.5,则目标保持不变。用纯黑色或白色绘制将生成明显更暗或更亮的区域,但不会生成纯黑色或白色。
plus 源添加到目标,结果替换目标。此运算符对于在两个图像之间动画淡入淡出非常有用。
add 与 'plus' 相同,但透明度数据被视为遮罩值。因此,任何图像中的透明区域都将保持透明。
minus 从目标图像中减去源图像中的颜色。当涉及透明度时,不透明区域将从任何目标不透明区域中减去。
subtract 从目标图像中减去源图像中的颜色。当涉及透明度时,透明区域会被减去,因此源图像中的仅不透明区域将保留在目标图像中。
difference 从较亮的两个组成颜色中减去较暗的颜色。用白色绘制会反转目标颜色。用黑色绘制不会产生任何变化。
exclusion 产生类似于 'difference' 的效果,但对比度较低。用白色绘制会反转目标颜色。用黑色绘制不会产生任何变化。
xor 位于目标外部的源部分与位于源外部的目标部分组合。
copy-* 将源图像中指定的通道复制到目标图像中的相同通道。如果源图像中指定的通道不存在(仅对方法 'copy-opacity' 或 'copy-black' 才会发生),则假设源图像是一个特殊灰度通道图像,其中包含要复制的值。
change-mask 用透明度替换任何与源图像像素相似的目标像素(如当前 -fuzz 因子定义)。
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