在Delphi XE中渲染混合矢量和位图图像的最佳方法是什么
我想能够渲染一个位图图像与像素之间的边界叠加(边界的颜色来自自制的例程)。在缩放和平移时,边界的滴答声应保持不变 下面是一个示例图像: 对于缩放和平移,我使用了如上所述的graphics32 为了绘制边界,我考虑使用AggPasMod为Delphi2010、XE、XE2制作一个矢量图像。。。由Christian Budde更新 然而,我很难让这两个工具都交互,因为AggPasMod使用它自己的图像类型:TAgg2DImage,我不知道如何在Timage和graphics32中绘制,它允许绘制TBitmap 既然我不是编码专家,我真的很想就解决这个问题的最佳方法提出一些建议在Delphi XE中渲染混合矢量和位图图像的最佳方法是什么,delphi,bitmap,vector-graphics,graphics32,aggpas,Delphi,Bitmap,Vector Graphics,Graphics32,Aggpas,我想能够渲染一个位图图像与像素之间的边界叠加(边界的颜色来自自制的例程)。在缩放和平移时,边界的滴答声应保持不变 下面是一个示例图像: 对于缩放和平移,我使用了如上所述的graphics32 为了绘制边界,我考虑使用AggPasMod为Delphi2010、XE、XE2制作一个矢量图像。。。由Christian Budde更新 然而,我很难让这两个工具都交互,因为AggPasMod使用它自己的图像类型:TAgg2DImage,我不知道如何在Timage和graphics32中绘制,它允许绘制TB
提前感谢,看到您自己是如何生成矢量图像的,您可以执行以下操作:
如果您需要更多信息,请告诉我,祝您好运:)您可能希望使用GR32的最新(beta)版本2.0,因为它引入了矢量引擎。有了它,您可以继续使用现有的代码,并添加在已有像素图像上绘制的矢量图形 为此,首先切换到最新的GR32版本。代码可以从开放的SVN存储库中获得。可以在此处找到主干: 如果使用SVN(推荐),可以使用
svn checkout svn://svn.code.sf.net/p/graphics32/code/trunk graphics32-code
或者使用OrtoiseSVN进行explorer集成
一旦你有了代码,你就可以开始探索了。有许多示例向您展示了如何使用向量引擎。请看“示例\绘图”下的示例
特别是看一下“多边形”示例,在该示例中,您可以使用鼠标创建(和操纵)多边形(创建简单三角形需要三次单击)
要自己创建矢量图形,可以使用以下代码:
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;
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;
此外,您还可以使用低级API。为此,您只需要单元“GR32_多边形”。同样的代码将如下所示:
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;
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代码编写。它既不是更快也不是更优雅,只是不同而已。从您的图像中,您似乎只是在像素化位图上绘制线条(即,像素不被线条分隔,而是被线条部分遮挡)。这是故意的还是你用来向我们展示你意图的绘图工具的产物?无论哪种方式,我都不会像你建议的那样去做,而是在画布上把每个像素画成一个正方形,边上分别画线,这比我想象的要容易得多。@Dsm:呈现的图像只是一个例子,真实的数据将包含超过3M个像素。我认为,在每次调用“缩放”时,放大重新绘制边界的矢量图像会更快。由于缩放是由鼠标滚轮控制的,如果要使边界保持恒定宽度以重新绘制,则鼠标滚轮的一个“长”滚动可能意味着图像应重新计算3-4次。您只需要重新绘制可见像素,这样图像大小就不会真正进入其中。我猜你只想在缩放超过一定大小的情况下绘制边界,否则你所看到的就是边界。低于该尺寸,只需使用普通图像绘制-高于该尺寸,则使用边界逐像素绘制。如果你有一个图形处理器,画一个正方形和两条或四条线作为边缘是非常快的,因为这都是由图形处理器并行处理的。我理解想象在图像上画一个矢量图形会更快,但在这种情况下,KISS更好(IMHO)。这里的矢量图形相当复杂,绘制速度相对较慢。这可能意味着图像应该重新计算3-4次:您可以添加一个计时器来避免这种情况。另请参见:。抱歉,由于回复太晚,我不得不同时做其他事情。如果第3步中提到了Tbitmap,请您精确说明。与步骤1相同吗?或者我应该使用不同的位图?我试图编辑您的帖子,但没有成功:在GR32中,SetAlpha的定义如下:italic_函数SetAlpha(Color32:TColor32;NewAlpha:Integer):TColor32_斜体谢谢你的更正。我想,我最近在HTML5画布上工作太多了。也就是说,您还可以使用HTML5画布式界面来创建最新的GR32库(和其他库),如下所示: