2

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

这是一个示例图像:图像显示边界厚度如何随放大倍数保持不变

对于缩放和平移,我使用的是graphics32,如此处所述 为了绘制边界,我想到了使用AggPasMod为 Delphi 2010、XE、XE2 制作矢量图像……由 Christian Budde更新

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

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

提前致谢,

4

2 回答 2

3

您可能希望使用 GR32 的最新(beta)版本 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 进行资源管理器集成。

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

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

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

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 代码编写。它既不是更快也不是更优雅,只是不同而已。

于 2016-04-12T09:58:36.630 回答
2

查看您如何自己生成矢量图像,您可以执行以下操作:

  1. 在 TBitmap 或 TBitmap32 上渲染主背景图像,保存此处使用的缩放和平移。
  2. 不是制作矢量图像,而是将矢量保存到线条数组中。
  3. 遍历线条数组并为与剪切矩形相交的每条线执行 TBitmap.Canvas.Draw。并且不要忘记在绘制这些线时纠正剪切偏移和缩放。

    (当放大 x2 时,您的线条将是两倍长,并且从顶部和左侧开始的距离是两倍,当从左侧平移 50 时,您在 line.start.x-50 等处绘制线条......)

您现在正在绘制输出图像,这使您可以独立于背景图像缩放量来更改线宽。

您当然可以使用线条绘制整个位图,而不是仅在剪切区域上绘制,并在需要不同的缩放级别或线宽时重新绘制。但是看看你如何拥有 3MP 图像,在显示它们时只渲染部分可能会更快。

如果您需要更多信息,请告诉我,祝您好运:)

于 2016-04-11T14:47:27.890 回答