4

我构建的 WPF 应用程序有一个包含各种 UIElement3D 对象的 Viewport3D。现在我想将某个视图的高分辨率快照保存到文件中。我过去曾尝试过 RenderTargetBitmap,但由于以下缺点,我不喜欢这种方法:

  • 内存泄漏(至少对于 .NET 3.5 SP1)。然而它应该用 4.0 解决,但我还没有测试过。
  • 使用抗锯齿和像素着色器时,软件渲染不会提供与硬件渲染相同的结果。
  • RenderTargetBitmap 需要大量时间(例如 10 秒)来形成图像,而不是在屏幕上显示所需的几分之一秒。

所以我想知道是否可以在新的控件/窗口(最好是屏幕外)中使用包含快照副本的 VisualBrush,然后使用 DirectX 或 GDI 技术通过前端或后端缓冲区获取内容。我可以想象超出显卡能力的分辨率可能是一个问题,但这可以通过抓取多个子图像并将它们拼接在一起来解决。那么有人对这个话题有一些想法吗?

请记住,我已经阅读过有关 DirectX、XNA、SlimDX、GDI+、BitBlt 等的信息,但这就是我在这些问题上的所有经验。目标平台是 Windows XP+。如果解决方案是可能的,但不是在 XP 上,我也想知道。

此致,

扬·范德波尔

4

1 回答 1

1

这是一个棘手的问题,因为 WPF 将其大部分内部工作保留给自己,但我的朋友 Jeremiah Morrill 发现了一种方法来利用 WPF 在渲染窗口时使用的底层 DirectX 表面。我已经将它用于一个听起来与您的需求非常相似的项目,并且它运行良好(并且比使用 WPF 提供的任何“禁止”方法快得多)。

您可能需要更多地熟悉 DirectX(不要太多,我保证!)但您可以阅读它并从他的博客下载工作源代码:

http://jmorrill.hjtcentral.com/Home/tabid/428/EntryId/438/How-to-get-access-to-WPF-s-internal-Direct3D-guts.aspx

于 2011-03-29T22:44:06.540 回答