我希望能够渲染一个在像素之间具有边界的叠加的位图图像(边界的颜色来自自制例程)。在缩放和平移时,边界的滴答度应保持不变。
这是一个示例图像:
对于缩放和平移,我正在使用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代码编写。它既不更快也不优雅,只是有所不同。