gpt4 book ai didi

delphi - 将 TImageList 字形绘制到 TDirect2DCanvas

转载 作者:行者123 更新时间:2023-12-02 03:17:47 30 4
gpt4 key购买 nike

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

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

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

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

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

最佳答案

如果您查看如何实现将图形对象绘制到 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 Canvas 时必然会遇到摩擦。根本无法将 GDI 位图直接传递到 Direct2D Canvas ,必须先将它们转换为 Direct2D 位图。

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

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

关于delphi - 将 TImageList 字形绘制到 TDirect2DCanvas,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44565105/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com