【问题标题】:Drawing a TImageList glyph to a TDirect2DCanvas将 TImageList 字形绘制到 TDirect2DCanvas
【发布时间】:2017-11-17 19:20:43
【问题描述】:

我目前正准备将旧组件的绘图代码从 GDI + UniScribe 替换为 Direct2D 和 DirectWrite(后继者)。

到目前为止,过渡是直截了当的,因为大多数时候我需要做的就是将对 Canvas(TCanvas 类)的调用替换为自定义 FDirect2DCanvas 实例(TDirect2DCanvas 类,来自 Direct2D 单元)。

不幸的是,当尝试从 TImageList 实例将字形绘制到 FDirect2DCanvas 上时,它似乎并不简单,因为 draw 方法仅适用于 TCanvas,而不适用于相当通用的 TCustomCanvas(它是 TCanvas 和 TDirect2DCanvas 的祖先) )。

解决这种困境的方法是将 TImageList 字形绘制到一个临时位图,然后将其绘制到 TDirect2DCanvas。但是,我担心这可能会大大降低绘图性能。

到目前为止,有没有人这样做过?我有什么选择?

【问题讨论】:

    标签: delphi vcl direct2d directwrite timagelist


    【解决方案1】:

    如果您查看将图形对象绘制到TDirect2DCanvas 是如何实现的,您会发现它通过这个例程进行路由。

    procedure TDirect2DCanvas.StretchDraw(const Rect: TRect; Graphic: TGraphic;
      Opacity: Byte);
    var
      D2DBitmap:  ID2D1Bitmap;
      D2DRect: TD2DRectF;
      Bitmap: TBitmap;
    begin
      Bitmap := TBitmap.Create;
      try
        Bitmap.Assign(Graphic);
    
        D2DBitmap := CreateBitmap(Bitmap);
    
        D2DRect.Left   := Rect.Left;
        D2DRect.Right  := Rect.Right;
        D2DRect.Top    := Rect.Top;
        D2DRect.Bottom := Rect.Bottom;
        RenderTarget.DrawBitmap(D2DBitmap, @D2DRect, Opacity/255);
      finally
        Bitmap.Free;
      end;
    end;
    

    让我们取消选择所涉及的步骤:

    1. 创建一个临时位图。
    2. 将图形复制到该位图中。
    3. 创建ID2D1Bitmap 并将临时位图复制到其中。
    4. ID2D1Bitmap 绘制到渲染目标上。

    这看起来已经非常低效了。当然,如果调用这个函数并传入 TBitmap 并无缘无故地制作副本,这将是一件令人讨厌的事情。

    当您尝试混合两个不同的图形框架时,这种事情是很难避免的。您的图像列表是基于 GDI 的,因此当您尝试将其发送到 Direct2D 画布时必然会遇到摩擦。根本无法将 GDI 位图直接传递到 Direct2D 画布,它们必须先转换为 Direct2D 位图。

    如果性能对您来说很重要,那么您不应该从图像列表开始。当您从 GDI 图像列表中提取位图,然后将其转换为等效的 Direct2D 对象 ID2D1Bitmap 时,这将不可避免地产生成本。

    为了获得最佳性能,请勿使用图片列表。从图像列表中提取每个图像并使用TDirect2DCanvas.CreateBitmap 获得一个Direct2D 位图ID2D1Bitmap。存储这些而不是图像列表。然后当你需要绘制时,在RenderTarget 上调用DrawBitmap,传递一个ID2D1Bitmap

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-18
      • 2016-11-08
      相关资源
      最近更新 更多