Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi XE中渲染混合矢量和位图图像的最佳方法是什么_Delphi_Bitmap_Vector Graphics_Graphics32_Aggpas - Fatal编程技术网

在Delphi XE中渲染混合矢量和位图图像的最佳方法是什么

在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

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

下面是一个示例图像:

对于缩放和平移,我使用了如上所述的graphics32 为了绘制边界,我考虑使用AggPasMod为Delphi2010、XE、XE2制作一个矢量图像。。。由Christian Budde更新

然而,我很难让这两个工具都交互,因为AggPasMod使用它自己的图像类型:TAgg2DImage,我不知道如何在Timage和graphics32中绘制,它允许绘制TBitmap

既然我不是编码专家,我真的很想就解决这个问题的最佳方法提出一些建议


提前感谢,

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

  • 在TBitmap或TBitmap32上渲染主背景图像,保存 这里使用的缩放和平移
  • 不制作矢量图像,而是将矢量保存到线阵列中
  • 走线阵列,为每一条线绘制一个TBitmap.Canvas.Draw 与剪切矩形相交的。别忘了改正 用于绘制这些线时的剪裁偏移和缩放

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

  • 现在,您正在输出图像上绘制,这允许您独立于背景图像缩放量更改线宽

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


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

    您可能希望使用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库(和其他库),如下所示: