我希望能够渲染一个在像素之间具有边界的叠加的位图图像(边界的颜色来自自制例程)。在缩放和平移时,边界的滴答度应保持不变。

这是一个示例图像:delphi - 在Delphi XE中渲染矢量和位图混合图像的最佳方法是什么-LMLPHP

对于缩放和平移,我正在使用here中所述的graphics32
为了划清界限,我想到了使用AggPasMod为Delphi 2010,XE,XE2 ...制作矢量图像的方法,该图像已由Christian Budde here更新。

但是,由于AggPasMod可以使用自己的图像类型,因此我很难同时使用这两种工具:TAgg2DImage,我不知道如何在Timage中进行绘制,而graphics32允许对TBitmap进行绘制。

由于我不是编码专家,因此,我非常想为解决该问题的最佳方法提供一些建议。

提前致谢,

最佳答案

您可能要使用GR32的最新(测试版)2.0版,因为它引入了矢量引擎。这样,您可以继续使用现有代码,并在已有的像素图像上添加绘制的矢量图形。

为此,请首先切换到最新的GR32版本。可以从打开的SVN存储库中获取代码。树干可以在这里找到:

https://sourceforge.net/p/graphics32/code/HEAD/tree/trunk/

如果您使用SVN(推荐),则可以使用签出代码

svn checkout svn://svn.code.sf.net/p/graphics32/code/trunk graphics32-code


或使用TortoiseSVN进行资源管理器集成。

一旦有了代码,就可以开始探索了。有许多示例向您展示如何使用矢量引擎。只需查看Examples \ Drawing下的示例。

特别要看一下“多边形”示例,在该示例中,您可以用鼠标创建(和操作)多边形(创建一个简单的三角形需要单击三下)。

要自己创建矢量图形,可以使用如下代码:

uses
  ..., GR32_Polygons, GR32_Paths, GR32_Brushes;

var
  Canvas: TCanvas32;
  Stroke: TStrokeBrush;
begin
  // use a higher level abstraction class to generate the polygons
  Canvas := TCanvas32.Create(Image.Bitmap);

  // add a stroke brush and specify the color and width
  Canvas.Brushes.Add(TStrokeBrush);
  Stroke := TStrokeBrush(Canvas.Brushes[0]);
  Stroke.FillColor := SetAlpha(clBlack32, 200);
  Stroke.StrokeWidth := 2;

  // begin a path
  Canvas.Path.BeginPath;

  // specify 3 vertices
  Canvas.Path.MoveTo(10, 10);
  Canvas.Path.LineTo(20, 90);
  Canvas.Path.LineTo(60, 40);

  // close path
  Canvas.Path.ClosePath;
  Canvas.Path.EndPath;
end;


另外,您可以使用低级API。为此,您只需要单位“ GR32_Polygons”。相同的代码将如下所示:

uses
  ..., GR32_Polygons;

var
  Points: array of TFloatPoint;
begin
  SetLength(Points, 3);

  // specify 3 vertices
  Points[0] := FloatPoint(10, 10);
  Points[1] := FloatPoint(20, 90);
  Points[2] := FloatPoint(60, 40);

  // draw poylgon with certain color and width
  PolylineFS(Image.Bitmap, Points, SetAlpha(clBlack32, 200), True, 2.0);
end;


尽管从一开始它看起来比较简单,但是使用矢量引擎绘制的图形越复杂,难度就越大。

要摆脱分别输入每个顶点的麻烦,可以使用GR32_VectorUtils单元中的辅助功能。这包括

Rectangle(const R: TFloatRect): TArrayOfFloatPoint;


这对您的应用程序最有用。

如果需要,还可以添加在绘制多边形之前应用的变换。



相同的示例也可以完全使用AggPas代码编写。它既不更快也不优雅,只是有所不同。

10-07 19:20
查看更多