首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将TImageList字形绘制为TDirect2DCanvas

将TImageList字形绘制为TDirect2DCanvas
EN

Stack Overflow用户
提问于 2017-06-15 10:26:19
回答 1查看 394关注 0票数 2

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

到目前为止,转换是直接进行的,因为我所需要做的大部分时间都是将对画布(类TCanvas)的调用替换为自定义FDirect2DCanvas实例(来自单元Direct2D的TDirect2DCanvas类)。

不幸的是,在试图将TImageList实例中的字形绘制到FDirect2DCanvas上时,似乎并不那么简单,因为绘图方法只用于TCanvas,而不是针对相当通用的TCustomCanvas (后者是TCanvas和TDirect2DCanvas的祖先)。

解决这一困境的方法是将TImageList字形绘制到临时位图上,并将其绘制到TDirect2DCanvas。然而,我担心这可能会大大减缓绘画的表现。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-15 12:28:09

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

代码语言:javascript
复制
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上的RenderTarget,传递一个ID2D1Bitmap

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44565105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档