- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前即将将旧组件的绘图代码从 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;
让我们取消所涉及的步骤:
ID2D1Bitmap
并将临时位图复制到其中。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/
TImageList 中可以存储的位图数量是否有限制? 我所说的限制是指它可以容纳的位图数量,和/或图像列表的内存大小。 谢谢。 最佳答案 图像列表在内部由 Windows 实现,将所有图像存储在一张
我正在使用 Delphi XE2 Update 3。Update 4 与我们的某些第 3 方组件不兼容,因此我们尚未更新。 我在我的应用程序中使用 TImageList。我注意到很多时候当它从源 Vi
我使用C ++ Builder,但是我认为这个问题与Delphi同样重要。 当我有两个TImageList对象时,有时我想在两个图像列表中使用相同的图标,则可以复制内容:ImageList2.Assi
是否可以连接到 TImageList 或创建后代,以捕获从它请求图像的时间,以便我每次都可以手动加载它? (特别是当 ListView 请求图像时) 最佳答案 不。两者都是 native 控件, Li
是否可以在运行时调用 TImagelist 编辑器来查看我的 TImagelist 的内容? 最佳答案 该编辑器是设计时编辑器,在运行时不可用,但您可以通过调用其 Draw 方法并指定要绘制的图像的索
我尝试使用 TToolbar 以及 TActionList、TSpeedbutton 和 TImageList 创建一个工具栏。 我使用了32px的方形图像,但是当我在TSpeedButton中通过I
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我试图通过将 .jpg 转换为 bmp 然后将其保存到 imagelist1 来将 jpg 加载到图像列表中。 从上到下的代码片段。Selectdir 有效,fileexists 部分有效。这用于加载
是否可以在运行时将图像从 TImageList 加载到 TTrayIcon 中?怎么样?这是个好主意吗?或者是否有更优选的方法在运行时更改托盘图标的图像? 最佳答案 在带有 Lazarus 0.9.3
我想从 ImageList 加载图片到 TImage (移动应用程序,fmx)。 TImage 是我的自定义样式列表框 ( LBItem.StylesData['myimage'] ) 的一部分。标准
如何从 TImageList 中获取 TPicture? 我需要做Image1.Picture:=...TPicture从图像列表中,将图像加载到 TImage 中。 图像列表存储我所有透明的 PNG
我只是在使用 AppMethod 1.17 aka Delphi 10 Seattle 的试用版。因此我无法查看源代码。 在 VCL 中,我使用了 TImageList.Draw(),但是对于新的 T
让我成为整数私有(private) 代码 procedure TForm1.Image1Click(Sender: TObject); begin inc(i); ImageList1.Get
我目前即将将旧组件的绘图代码从 GDI + UniScribe 替换为 Direct2D 和 DirectWrite(后继者)。 到目前为止,转换很简单,因为大多数时候我需要做的就是将对 Canvas
使用 Borland C++ Builder 2009 我从 W7 Windows 对话框中截取了三个按钮并将它们放入 TImageList 中。我会在适当的时候将 3 个变体加载到 TImage 中
我有一个 Delphi 6 应用程序,它可以在 TListBox 行中绘制图标以及一些文本。 TListBox 的样式设置为 lbOwnerDrawVariable。我遇到的问题是选择一个项目时。列表
我正在使用 Delphi XE。 我在表单上添加了一个 TAdvGlowButton,并添加了一个 TImageList,其中包含一个透明 PNG 图像作为其图像源。当我在设计模式下查看表单时,按钮看
我想让 HeidiSQL 具有高 dpi 意识,其中包括升级我的一个 TImageList,其中包含许多 alpha 透明的 PNG 图标。 我已经烘焙了一个程序,但它破坏了正常的透明度和 alpha
我想在 TImageList 中加载具有透明背景的 PNG 并在 TMainMenu 中使用它(通过 TAction)。 然而,在 Delphi 中,背景只是黑色。 This家伙说这对他有用,但用的是
我有一个 TImageList,其中包含透明图标(32 位,带 Alpha channel )。我想要做的是将基于图像索引的各个图标保存为 PNG 文件,同时保留 Alpha channel 透明度。
我是一名优秀的程序员,十分优秀!