Magick::Drawable

Drawable 提供了一个方便的接口,用于为 Image::draw() 方法准备矢量、图像或文本参数。Drawable 子类的每个实例都表示一个单独的可绘制对象。可绘制对象可以通过多次调用 Image draw() 方法“逐个”绘制,或者可以通过将 Drawable 对象列表传递给 Image draw() 方法“一次性”绘制。逐个绘制方法对于简单的绘图很方便,而基于列表的方法则适用于需要更复杂绘图的情况。

以下是一个使用 Drawable 子类以逐个绘制方法绘制下图的示例

example

#include <string> #include <iostream> #include <Magick++.h> using namespace std; using namespace Magick; int main(int /*argc*/,char **argv) { try { InitializeMagick(*argv); // 创建基础图像(300x200像素的白色图像) Image image( Geometry(300,200), Color("white") ); // 设置绘图选项 image.strokeColor("red"); // 轮廓颜色 image.fillColor("green"); // 填充颜色 image.strokeWidth(5); // 绘制圆形 image.draw( DrawableCircle(100,100, 50,100) ); // 绘制矩形 image.draw( DrawableRectangle(200,200, 270,170) ); // 显示结果 image.display( ); } catch( exception & error_ ) { cout << "Caught exception: " << error_.what() << endl; return 1; } return 0; }

由于 Drawable 是一个对象,因此可以将其保存在数组或列表中以供以后(可能重复)使用。以下示例演示了如何使用基于列表的方法绘制相同的图形

#include <string> #include <iostream> #include <list> #include <Magick++.h> using namespace std; using namespace Magick; int main(int /*argc*/,char **/*argv*/) { try { InitializeMagick(*argv); // 创建基础图像(300x200像素的白色图像) Image image( Geometry(300,200), Color("white") ); // 构造绘图列表 std::list<Magick::Drawable> drawList; // 将一些绘图选项添加到绘图列表 drawList.push_back(DrawableStrokeColor("red")); // 轮廓颜色 drawList.push_back(DrawableStrokeWidth(5)); // 描边宽度 drawList.push_back(DrawableFillColor("green")); // 填充颜色 // 将圆形添加到绘图列表 drawList.push_back(DrawableCircle(100,100, 50,100)); // 将矩形添加到绘图列表 drawList.push_back(DrawableRectangle(200,100, 270,170)); // 使用完成的绘图列表绘制所有内容 image.draw(drawList); // 显示结果 image.display( ); } catch( exception & error_ ) { cout << "Caught exception: " << error_.what() << endl; return 1; } return 0; }

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 通道或透明度,以便不透明部分允许部分(或全部)合成图像透视。如果指定的widthheight为零,则图像以其自然大小合成,不进行放大或缩小。

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 通道或透明度,以便不透明部分允许部分(或全部)合成图像透视。如果指定的widthheight为零,则图像以其自然大小合成,不进行放大或缩小。

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_,
StyleType style_,
unsigned int weight_,
StretchType stretch_

指定字体系列、样式、粗细(一组 { 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)。禁用文本抗锯齿的主要原因是避免为图像添加新颜色。

DrawableTextDecoration

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”命令建立一个新的当前点。效果就像“笔”被抬起并移动到新的位置。路径数据段必须以“moveto”命令之一或“arc”命令之一开头。随后的“moveto”命令(即,“moveto”不是第一个命令时)表示新子路径的开始

Moveto 类

子类

构造函数签名

描述

PathMovetoAbs

const Magick::Coordinate &coordinate_

在给定坐标处开始一个新的子路径。PathMovetoAbs表示将使用绝对坐标;PathMovetoRel表示将使用相对坐标。如果相对 moveto 作为路径的第一个元素出现,则将其视为一对绝对坐标。如果 moveto 后面跟着多对坐标,则后续对将被视为隐式的 lineto 命令。

const std::list<Magick::Coordinate> &coordinates_

PathMovetoRel

const Magick::Coordinate &coordinate_

const std::list<Magick::Coordinate> &coordinates_

“closepath”命令

“closepath”命令导致从当前点到当前子路径的初始点自动绘制一条直线

Closepath 类

子类

构造函数签名

描述

PathClosePath

void

通过从当前点到当前子路径最新的起始点(通常是最近的 moveto 点)绘制一条直线来关闭当前子路径。

“lineto”命令

各种“lineto”命令从当前点到新点绘制直线

Lineto 类

子类

构造函数签名

描述

PathLinetoAbs

const Magick::Coordinate& coordinate_

从当前点到给定坐标绘制一条线,该坐标成为新的当前点。PathLinetoAbs表示使用绝对坐标;PathLinetoRel表示使用相对坐标。可以在列表中指定多个坐标对以绘制折线。在命令结束时,新的当前点将设置为提供的最终坐标集。

const std::list<Magick::Coordinate> &coordinates_

PathLinetoRel

const Magick::Coordinate& coordinate_

const std::list<Magick::Coordinate> &coordinates_

PathLinetoHorizontalAbs

double x_

从当前点 (cpx, cpy) 到 (x, cpy) 绘制一条水平线。PathLinetoHorizontalAbs表示提供绝对坐标;PathLinetoHorizontalRel表示提供相对坐标。在命令结束时,新的当前点将变为 (x, cpy)(对于 x 的最终值)。

PathLinetoHorizontalRel

double x_

PathLinetoVerticalAbs

double y_

从当前点 (cpx, cpy) 到 (cpx, y) 绘制一条垂直线。PathLinetoVerticalAbs表示提供绝对坐标;PathLinetoVerticalRel表示提供相对坐标。在命令结束时,新的当前点将变为 (cpx, y)(对于 y 的最终值)。

PathLinetoVerticalRel

double y_

曲线命令

这三组命令绘制曲线

三次贝塞尔曲线命令

三次贝塞尔曲线命令依赖于PathCurvetoArgs参数类,该类的构造函数签名为

  PathCurvetoArgs( double x1_, double y1_, 
                   double x2_, double y2_, 
                   double x_, double y_ );

命令如下

三次贝塞尔曲线类

子类

构造函数签名

描述

PathCurvetoAbs

const Magick::PathCurvetoArgs &args_

使用 (x1,y1) 作为曲线的起始控制点和 (x2,y2) 作为曲线的结束控制点,从当前点到 (x,y) 绘制三次贝塞尔曲线。PathCurvetoAbs表示将使用绝对坐标;PathCurvetoRel表示将使用相对坐标。可以指定多组坐标来绘制多贝塞尔曲线。在命令结束时,新的当前点将变为多贝塞尔曲线中使用的最终 (x,y) 坐标对。

const std::list<Magick::PathCurvetoArgs> &args_

PathCurvetoRel

const Magick::PathCurvetoArgs &args_

const std::list<Magick::PathCurvetoArgs> &args_

PathSmoothCurvetoAbs

const Magick::Coordinate &coordinates_

从当前点到 (x,y) 绘制三次贝塞尔曲线。第一个控制点假定为先前命令的第二个控制点相对于当前点的反射。(如果没有先前的命令,或者如果先前的命令不是PathCurvetoAbsPathCurvetoRelPathSmoothCurvetoAbsPathSmoothCurvetoRel,则假定第一个控制点与当前点重合。)(x2,y2) 是第二个控制点(即曲线末端的控制点)。PathSmoothCurvetoAbs表示将使用绝对坐标;PathSmoothCurvetoRel表示将使用相对坐标。可以指定多组坐标来绘制多贝塞尔曲线。在命令结束时,新的当前点将变为多贝塞尔曲线中使用的最终 (x,y) 坐标对。

const std::list<Magick::Coordinate> &coordinates_

PathSmoothCurvetoRel

const Magick::Coordinate &coordinates_

const std::list<Magick::Coordinate> &coordinates_

二次贝塞尔曲线命令

二次贝塞尔曲线命令依赖于PathQuadraticCurvetoArgs参数类,该类的构造函数签名为

  PathQuadraticCurvetoArgs( double x1_, double y1_, 
                            double x_, double y_ );

二次贝塞尔曲线命令如下

二次贝塞尔曲线类

子类

构造函数签名

描述

PathQuadraticCurvetoAbs

const Magick::PathQuadraticCurvetoArgs &args_

使用 (x1,y1) 作为控制点,从当前点到 (x,y) 绘制二次贝塞尔曲线。PathQuadraticCurvetoAbs表示将使用绝对坐标;PathQuadraticCurvetoRel表示将使用相对坐标。可以指定多组坐标来绘制多贝塞尔曲线。在命令结束时,新的当前点将变为多贝塞尔曲线中使用的最终 (x,y) 坐标对。

const std::list<Magick::PathQuadraticCurvetoArgs> &args_

PathQuadraticCurvetoRel

const Magick::PathQuadraticCurvetoArgs &args_

const std::list<Magick::PathQuadraticCurvetoArgs> &args_

PathSmoothQuadraticCurvetoAbs

const Magick::Coordinate &coordinate_

从当前点到 (x,y) 绘制二次贝塞尔曲线。控制点假定为先前


相对于当前点的命令。(如果没有之前的命令,或者之前的命令不是PathQuadraticCurvetoAbsPathQuadraticCurvetoRelPathSmoothQuadraticCurvetoAbsPathSmoothQuadraticCurvetoRel,则假设控制点与当前点重合。)PathSmoothQuadraticCurvetoAbs表示将使用绝对坐标;PathSmoothQuadraticCurvetoRel表示将使用相对坐标。在命令结束时,新的当前点将成为多贝塞尔曲线中使用的最终(x,y)坐标对。

const std::list<Magick::Coordinate> &coordinates_

PathSmoothQuadraticCurvetoRel

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_ );

椭圆弧命令如下

椭圆弧曲线类

子类

构造函数签名

描述

PathArcAbs

const Magick::PathArcArgs &coordinates_

从当前点绘制到(x, y)的椭圆弧。椭圆的大小和方向由两个半径(radiusX, radiusY)和一个xAxisRotation定义,xAxisRotation指示整个椭圆相对于当前坐标系的旋转方式。椭圆的中心(cx, cy)是自动计算得到的,以满足其他参数施加的约束。largeArcFlagsweepFlag有助于自动计算,并帮助确定如何绘制弧线。如果largeArcFlag为真,则绘制可用弧线中较大的一个。如果sweepFlag为真,则绘制与顺时针旋转匹配的弧线。

const std::list<Magick::PathArcArgs> &coordinates_

PathArcRel

const Magick::PathArcArgs &coordinates_

const std::list<Magick::PathArcArgs> &coordinates_