Drawable 提供了一个方便的接口,用于为 Image::draw() 方法准备矢量、图像或文本参数。Drawable 子类的每个实例都表示一个单独的可绘制对象。可绘制对象可以通过多次调用 Image draw() 方法“逐个”绘制,或者可以通过将 Drawable 对象列表传递给 Image draw() 方法“一次性”绘制。逐个绘制方法对于简单的绘图很方便,而基于列表的方法则适用于需要更复杂绘图的情况。
以下是一个使用 Drawable 子类以逐个绘制方法绘制下图的示例
由于 Drawable 是一个对象,因此可以将其保存在数组或列表中以供以后(可能重复)使用。以下示例演示了如何使用基于列表的方法绘制相同的图形
Drawable 依赖于简单的 Coordinate 结构,该结构表示一对 x,y 坐标。Coordinate 结构提供的方法如下表所示
Coordinate 结构方法
方法/成员 |
签名 |
描述 |
---|---|---|
Coordinate |
void |
默认构造函数 |
double x_, double y_ |
构造函数,设置first & second | |
x |
double x_ |
x 坐标成员 |
y |
double y_ |
y 坐标成员 |
Drawable 类如下表所示。此处仅记录构造函数签名。每个 Drawable 类还提供了一些方法,可以通过这些方法调整每个单独的参数。
Drawable 类
子类 |
构造函数签名 |
描述 |
---|---|---|
DrawableAffine |
double sx_, double sy_, double rx_, double ry_, double tx_, double ty_ |
指定一个变换矩阵,以调整后续绘制对象的缩放、旋转和平移(坐标变换)。sx_ & sy_ 参数表示 x & y 缩放因子,rx_ & ry_ 参数表示 x & y 旋转,tx_ & ty_ 参数表示 x & y 平移。 |
void |
指定一个变换矩阵,以调整后续绘制对象的缩放、旋转和平移(坐标变换)。初始化为单位(无效果)仿射值。使用类方法(目前未记录)从其单位值调整各个参数。 | |
DrawableAngle |
double angle_ |
设置绘图角度 |
DrawableArc |
double startX_, double startY_, double endX_, double endY_, double startDegrees, double endDegrees_ |
使用stroke颜色绘制一条弧线,并基于从坐标startX_、startY_开始,到坐标endX_、endY_结束的圆,以及由旋转弧startDegrees_、endDegrees_限定的圆。 |
DrawableBezier |
const std::list<Magick::Coordinate> &coordinates_ |
使用stroke颜色绘制贝塞尔曲线,并基于coordinates_列表中指定的坐标。 |
DrawableClipPath |
const std::string &id_ |
选择与id_匹配的绘图剪辑路径。 |
DrawableCircle |
double originX_, double originY_, double perimX_, double perimY_ |
使用指定的原点和周长坐标,使用stroke颜色和粗细绘制一个圆。如果指定了fill颜色,则填充对象。 |
DrawableColor |
double x_, double y_, PaintMethod paintMethod_ |
根据 paintMethod 对图像进行着色。point 方法重新着色目标像素。replace 方法重新着色与目标像素颜色匹配的任何像素。Floodfill 重新着色与目标像素颜色匹配且为相邻像素的任何像素,而 filltoborder 重新着色任何不是边界颜色的相邻像素。最后,reset 重新着色所有像素。 |
DrawableCompositeImage |
double x_, double y_, const std::string &filename_ |
将当前图像与指定图像的内容合成,位于指定的坐标处。如果matte属性设置为true,则图像合成将考虑图像文件中存在的 Alpha 通道或透明度,以便不透明部分允许部分(或全部)合成图像透视。 |
double x_, double y_, const Image &image_ | ||
double x_, double y_, double width_, double height_, const std::string &filename_ |
将当前图像与指定图像的内容合成,使用指定的宽度和高度呈现,位于指定的坐标处。如果matte属性设置为true,则图像合成将考虑图像文件中存在的 Alpha 通道或透明度,以便不透明部分允许部分(或全部)合成图像透视。如果指定的width或height为零,则图像以其自然大小合成,不进行放大或缩小。 | |
double x_, double y_, double width_, double height_, const Image &image_ | ||
double x_, double y_, double width_, double height_, const std::string &filename_, CompositeOperator composition_ |
使用指定的合成算法将当前图像与指定图像的内容合成,使用指定的宽度和高度呈现,位于指定的坐标处。如果matte属性设置为true,则图像合成将考虑图像文件中存在的 Alpha 通道或透明度,以便不透明部分允许部分(或全部)合成图像透视。如果指定的width或height为零,则图像以其自然大小合成,不进行放大或缩小。 | |
double x_, double y_, double width_, double height_, const Image &image_, CompositeOperator composition_ | ||
DrawableDashArray |
const double* dasharray_ |
指定用于描边路径的虚线和间隙模式。strokeDashArray 表示一个以零结尾的数字数组,以像素为单位指定交替虚线和间隙的长度。如果提供了奇数个值,则重复值列表以产生偶数个值。一个典型的 strokeDashArray_ 数组可能包含成员 5 3 2 0,其中零值表示模式数组的结尾。 |
DrawableDashOffset |
double offset_ |
指定开始虚线的虚线图案中的距离。请参阅 SVG 的文档 stroke-dashoffset 属性的用法详细信息。 |
DrawableEllipse |
double originX_, double originY_, double radiusX_, double radiusY_, double arcStart_, double arcEnd_ |
使用stroke颜色和粗细绘制椭圆,指定原点、x & y 半径,以及以度为单位指定的弧的开始和结束。如果指定了fill颜色,则填充对象。 |
DrawableFillColor |
const Color &color_ |
指定绘图对象的填充颜色。 |
DrawableFillRule |
FillRule fillRule_ |
指定用于确定画布的哪些部分包含在形状内部的算法。请参阅 SVG 的文档 fill-rule 属性的用法详细信息。 |
DrawableFillOpacity |
double opacity_ |
指定使用填充颜色绘制时的不透明度。 |
DrawableFont |
const std::string &font_ |
指定绘制文本时使用的字体名称。 |
const std::string &family_, |
指定字体系列、样式、粗细(一组 { 100 | 200 | 300 | 400 | 500 | 600 | 700 | 800 | 900 },其中 400 为正常大小)和拉伸,以选择绘制文本时使用的字体。可以使用 AnyStyle 枚举对样式应用通配符匹配,如果 weight 为零则对 weight 应用通配符匹配,并通过 AnyStretch 枚举对 stretch 应用通配符匹配。 | |
DrawableGravity |
GravityType gravity_ |
指定文本定位重力。 |
DrawableLine |
double startX_, double startY_, double endX_, double endY_ |
使用stroke颜色和粗细绘制一条线,使用起始和结束坐标 |
DrawableMatte |
double x_, double y_, PaintMethod paintMethod_ |
将像素遮罩值更改为透明。point 方法更改目标像素的遮罩值。replace 方法更改与目标像素颜色匹配的任何像素的遮罩值。Floodfill 更改与目标像素颜色匹配且为相邻像素的任何像素的遮罩值,而 filltoborder 更改任何不是边界颜色的相邻像素的遮罩值,最后 reset 更改所有像素的遮罩值。 |
DrawableMiterLimit |
size_t miterLimit_ |
指定斜接限制。当两条线段以锐角相交且已为“lineJoin”指定斜接连接时,斜接可能扩展到远远超出描边路径的线条粗细。miterLimit' 对斜接长度与“lineWidth”的比率施加限制。此参数的默认值为 4。 |
DrawablePath |
const std::list<Magick::VPath> &path_ |
使用矢量路径在图像上绘制。 |
DrawablePoint |
double x_, double y_ |
使用stroke颜色和粗细在坐标处绘制一个点 |
DrawablePointSize |
double pointSize_ |
设置字体大小。 |
DrawablePolygon |
const std::list<Magick::Coordinate> &coordinates_ |
使用stroke颜色和粗细绘制任意多边形,该多边形由包含在 STL 列表中的三个或更多坐标组成。如果指定了fill颜色,则填充对象。 |
DrawablePolyline |
const std::list<Magick::Coordinate> &coordinates_ |
使用stroke颜色和粗细绘制任意折线,该折线由包含在 STL 列表中的三个或更多坐标组成。如果指定了fill颜色,则填充对象。 |
DrawablePopClipPath |
void |
弹出(终止)由 DrawablePushClipPath 启动的剪辑路径定义。 |
DrawablePopGraphicContext |
void |
弹出图形上下文。从图形上下文堆栈中删除当前图形上下文会将选项恢复到在之前的 DrawablePushGraphicContext 操作之前的它们的值。 |
DrawablePushClipPath |
const std::string &id_ |
使用 id_ 推送(创建)剪辑路径定义。剪辑补丁定义由后续绘图命令组成,并以 DrawablePopClipPath 终止。 |
DrawablePushGraphicContext |
void |
推送图形上下文。当推送图形上下文时,在推送上下文后设置的选项(例如坐标变换、颜色设置等)将保存到新的图形上下文。这允许将相关选项保存在图形上下文“堆栈”上,以便支持选项的分层嵌套。当 DrawablePopGraphicContext 用于弹出当前图形上下文时,将恢复在上次DrawablePushGraphicContext操作期间有效的选项。 |
DrawablePushPattern |
std::string &id_, ssize_t x_, ssize_t y_, size_t width_, size_t height_ |
使用id_指定的任意图案名称开始图案定义,图案偏移量由x_和y_指定,图案大小由width_和height_指定。图案在由指定的偏移量和大小定义的坐标系内定义。可以在 DrawableCompositeImage之间指定任意绘图对象(包括 DrawablePushPattern 和 DrawablePopPattern 以绘制图案。通常,这对 DrawablePushGraphicContext & DrawablePopGraphicContext 用于包含图案定义。图案定义以 DrawablePopPattern 对象终止。 |
DrawablePopPattern |
void |
终止通过 DrawablePushPattern. |
DrawableRectangle |
double upperLeftX_, double upperLeftY_, double lowerRightX_, double lowerRightY |
使用stroke颜色和粗细从左上角坐标到右下角坐标绘制矩形。如果指定了fill颜色,则填充对象。 |
DrawableRotation |
double angle_ |
设置绘制时使用的旋转(坐标变换)。 |
DrawableRoundRectangle |
double centerX_, double centerY_, double width_, double hight_, double cornerWidth_, double cornerHeight_ |
使用stroke颜色和粗细绘制圆角矩形,指定中心坐标、宽度和高度以及圆角宽度和高度。如果指定了fill颜色,则填充对象。 |
DrawableScaling |
double x_, double y_ |
在绘制对象时应用 x 和 y 方向的缩放(坐标变换)。 |
DrawableSkewX |
double angle_ |
应用 X 方向的倾斜(坐标变换) |
DrawableSkewY |
double angle_ |
应用 Y 方向的倾斜 |
DrawableStrokeAntialias |
bool flag_ |
在绘制线条或对象轮廓时进行抗锯齿。 |
DrawableStrokeColor |
const Color &color_ |
设置绘制线条或对象轮廓时使用的颜色。 |
DrawableStrokeLineCap |
LineCap linecap_ |
指定在描边开放子路径的末端使用的形状。LineCap 的值为 UndefinedCap、ButtCap、RoundCap 和 SquareCap。 |
DrawableStrokeLineJoin |
LineJoin linejoin_ |
指定在描边路径(或其他矢量形状)的拐角处使用的形状。LineJoin 的值为 UndefinedJoin、MiterJoin、RoundJoin 和 BevelJoin。 |
DrawableStrokeOpacity |
double opacity_ |
绘制线条或对象轮廓时使用的透明度。 |
DrawableStrokeWidth |
double width_ |
设置绘制线条或对象轮廓时使用的宽度。 |
DrawableText |
double x_, double y_, std::string text_ |
使用stroke颜色、字体、字体大小和box颜色(文本背景颜色)在指定坐标处为图像添加文本注释。如果文本包含 特殊格式字符 则图像文件名、类型、宽度、高度或其他图像属性可以包含在文本中(参见 label())。 |
const double x_, const double y_, const std::string &text_, const std::string &encoding_ |
使用文本编码表示的文本为图像添加注释,使用当前stroke颜色、字体、字体大小和box颜色(文本背景颜色)在指定坐标处添加注释。如果文本包含 特殊格式字符 则图像文件名、类型、宽度、高度或其他图像属性可以包含在文本中(参见 label())。 文本编码指定用于文本注释的代码集。目前只能指定的字符编码是“UTF-8”用于表示 Unicode 作为字节序列。指定空字符串以将文本编码设置为系统的默认值。使用 Unicode 进行成功的文本注释可能需要设计为支持 Unicode 的字体。 | |
DrawableTextAntialias |
bool flag_ |
在绘制文本时进行抗锯齿(默认为 true)。禁用文本抗锯齿的主要原因是避免为图像添加新颜色。 |
DecorationType decoration_ |
指定要应用于文本的装饰(例如 UnderlineDecoration)。 | |
DrawableTextUnderColor |
const Color &color_ |
使用指定颜色在渲染文本下方绘制一个框。 |
DrawableTranslation |
double x_, double y_ |
应用坐标平移(设置新的坐标原点)。 |
DrawableViewbox |
ssize_t x1_, ssize_t y1_, ssize_t x2_, ssize_t y2_ |
输出视区的尺寸。如果要将图像写入矢量格式(例如 MVG 或 SVG),则应将 DrawablePushGraphicContext() 对象推送到列表的头部,然后使用 DrawableViewbox() 语句建立输出画布大小。应将匹配的 DrawablePopGraphicContext() 对象推送到列表的尾部。 |
Magick++ 支持的矢量路径基于SVG XML 规范支持的矢量路径。矢量路径不能直接绘制,必须首先作为构造函数参数提供给DrawablePath类以创建可绘制对象。DrawablePath类有效地创建了一个可绘制的复合组件,可以根据需要重放它。如果可绘制的复合组件仅由使用相对坐标的矢量路径对象组成,则可以通过在它前面放置一个DrawablePath来将其定位在图像上,该DrawablePath设置当前绘图坐标。或者,可以使用坐标变换来平移原点以定位对象,旋转它,倾斜它或缩放它。
“moveto”命令建立一个新的当前点。效果就像“笔”被抬起并移动到新的位置。路径数据段必须以“moveto”命令之一或“arc”命令之一开头。随后的“moveto”命令(即,“moveto”不是第一个命令时)表示新子路径的开始
Moveto 类
子类 |
构造函数签名 |
描述 |
---|---|---|
const Magick::Coordinate &coordinate_ |
在给定坐标处开始一个新的子路径。PathMovetoAbs表示将使用绝对坐标;PathMovetoRel表示将使用相对坐标。如果相对 moveto 作为路径的第一个元素出现,则将其视为一对绝对坐标。如果 moveto 后面跟着多对坐标,则后续对将被视为隐式的 lineto 命令。 | |
const std::list<Magick::Coordinate> &coordinates_ | ||
const Magick::Coordinate &coordinate_ | ||
const std::list<Magick::Coordinate> &coordinates_ |
“closepath”命令导致从当前点到当前子路径的初始点自动绘制一条直线
Closepath 类
子类 |
构造函数签名 |
描述 |
---|---|---|
void |
通过从当前点到当前子路径最新的起始点(通常是最近的 moveto 点)绘制一条直线来关闭当前子路径。 |
各种“lineto”命令从当前点到新点绘制直线
Lineto 类
子类 |
构造函数签名 |
描述 |
---|---|---|
const Magick::Coordinate& coordinate_ |
从当前点到给定坐标绘制一条线,该坐标成为新的当前点。PathLinetoAbs表示使用绝对坐标;PathLinetoRel表示使用相对坐标。可以在列表中指定多个坐标对以绘制折线。在命令结束时,新的当前点将设置为提供的最终坐标集。 | |
const std::list<Magick::Coordinate> &coordinates_ | ||
const Magick::Coordinate& coordinate_ | ||
const std::list<Magick::Coordinate> &coordinates_ | ||
double x_ |
从当前点 (cpx, cpy) 到 (x, cpy) 绘制一条水平线。PathLinetoHorizontalAbs表示提供绝对坐标;PathLinetoHorizontalRel表示提供相对坐标。在命令结束时,新的当前点将变为 (x, cpy)(对于 x 的最终值)。 | |
double x_ | ||
double y_ |
从当前点 (cpx, cpy) 到 (cpx, y) 绘制一条垂直线。PathLinetoVerticalAbs表示提供绝对坐标;PathLinetoVerticalRel表示提供相对坐标。在命令结束时,新的当前点将变为 (cpx, y)(对于 y 的最终值)。 | |
double y_ |
这三组命令绘制曲线
三次贝塞尔曲线命令。三次贝塞尔曲线段由起点、终点和两个控制点定义。
二次贝塞尔曲线命令。二次贝塞尔曲线段由起点、终点和一个控制点定义。
椭圆弧命令。椭圆弧段绘制椭圆的一部分。
三次贝塞尔曲线命令依赖于PathCurvetoArgs参数类,该类的构造函数签名为
PathCurvetoArgs( double x1_, double y1_, double x2_, double y2_, double x_, double y_ );
命令如下
三次贝塞尔曲线类
子类 |
构造函数签名 |
描述 |
---|---|---|
const Magick::PathCurvetoArgs &args_ |
使用 (x1,y1) 作为曲线的起始控制点和 (x2,y2) 作为曲线的结束控制点,从当前点到 (x,y) 绘制三次贝塞尔曲线。PathCurvetoAbs表示将使用绝对坐标;PathCurvetoRel表示将使用相对坐标。可以指定多组坐标来绘制多贝塞尔曲线。在命令结束时,新的当前点将变为多贝塞尔曲线中使用的最终 (x,y) 坐标对。 | |
const std::list<Magick::PathCurvetoArgs> &args_ | ||
const Magick::PathCurvetoArgs &args_ | ||
const std::list<Magick::PathCurvetoArgs> &args_ | ||
const Magick::Coordinate &coordinates_ |
从当前点到 (x,y) 绘制三次贝塞尔曲线。第一个控制点假定为先前命令的第二个控制点相对于当前点的反射。(如果没有先前的命令,或者如果先前的命令不是PathCurvetoAbs、PathCurvetoRel、PathSmoothCurvetoAbs或PathSmoothCurvetoRel,则假定第一个控制点与当前点重合。)(x2,y2) 是第二个控制点(即曲线末端的控制点)。PathSmoothCurvetoAbs表示将使用绝对坐标;PathSmoothCurvetoRel表示将使用相对坐标。可以指定多组坐标来绘制多贝塞尔曲线。在命令结束时,新的当前点将变为多贝塞尔曲线中使用的最终 (x,y) 坐标对。 | |
const std::list<Magick::Coordinate> &coordinates_ | ||
const Magick::Coordinate &coordinates_ | ||
const std::list<Magick::Coordinate> &coordinates_ |
二次贝塞尔曲线命令依赖于PathQuadraticCurvetoArgs参数类,该类的构造函数签名为
PathQuadraticCurvetoArgs( double x1_, double y1_, double x_, double y_ );
二次贝塞尔曲线命令如下
二次贝塞尔曲线类
子类 |
构造函数签名 |
描述 |
---|---|---|
const Magick::PathQuadraticCurvetoArgs &args_ |
使用 (x1,y1) 作为控制点,从当前点到 (x,y) 绘制二次贝塞尔曲线。PathQuadraticCurvetoAbs表示将使用绝对坐标;PathQuadraticCurvetoRel表示将使用相对坐标。可以指定多组坐标来绘制多贝塞尔曲线。在命令结束时,新的当前点将变为多贝塞尔曲线中使用的最终 (x,y) 坐标对。 | |
const std::list<Magick::PathQuadraticCurvetoArgs> &args_ | ||
const Magick::PathQuadraticCurvetoArgs &args_ | ||
const std::list<Magick::PathQuadraticCurvetoArgs> &args_ | ||
const Magick::Coordinate &coordinate_ |
从当前点到 (x,y) 绘制二次贝塞尔曲线。控制点假定为先前 相对于当前点的命令。(如果没有之前的命令,或者之前的命令不是PathQuadraticCurvetoAbs、PathQuadraticCurvetoRel、PathSmoothQuadraticCurvetoAbs或PathSmoothQuadraticCurvetoRel,则假设控制点与当前点重合。)PathSmoothQuadraticCurvetoAbs表示将使用绝对坐标;PathSmoothQuadraticCurvetoRel表示将使用相对坐标。在命令结束时,新的当前点将成为多贝塞尔曲线中使用的最终(x,y)坐标对。 | |
const std::list<Magick::Coordinate> &coordinates_ | ||
const Magick::Coordinate &coordinate_ | ||
const std::list<Magick::Coordinate> &coordinates_ |
椭圆弧曲线命令依赖于PathArcArgs参数类,该类具有以下构造函数签名
PathArcArgs( double radiusX_, double radiusY_, double xAxisRotation_, bool largeArcFlag_, bool sweepFlag_, double x_, double y_ );
椭圆弧命令如下
椭圆弧曲线类
子类 |
构造函数签名 |
描述 |
---|---|---|
const Magick::PathArcArgs &coordinates_ |
从当前点绘制到(x, y)的椭圆弧。椭圆的大小和方向由两个半径(radiusX, radiusY)和一个xAxisRotation定义,xAxisRotation指示整个椭圆相对于当前坐标系的旋转方式。椭圆的中心(cx, cy)是自动计算得到的,以满足其他参数施加的约束。largeArcFlag和sweepFlag有助于自动计算,并帮助确定如何绘制弧线。如果largeArcFlag为真,则绘制可用弧线中较大的一个。如果sweepFlag为真,则绘制与顺时针旋转匹配的弧线。 | |
const std::list<Magick::PathArcArgs> &coordinates_ | ||
const Magick::PathArcArgs &coordinates_ | ||
const std::list<Magick::PathArcArgs> &coordinates_ |