2010-08-09 99 views
4

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

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

所以我不知道它是否可能使用VisualBrush,含有快照拷贝,在一个新的控制/窗口(优选离屏),然后抓住内容线槽前置式或后备缓冲使用DirectX或GDI技术。我可以想象,除了显卡功能之外的解决方案可能是一个问题,但这可以通过抓取多个子图像并将它们连接在一起来解决。那么有人对这个主题有一些想法?

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

最好的问候,

扬·德波尔

回答

1

这是一个棘手的问题,因为WPF保持这么多的内部工作的本身,而是我的一个朋友,耶利米莫里尔,已经发现了一种挖掘WPF在渲染窗口时使用的底层DirectX表面。我已经将它用于一个项目,这听起来像是和你的项目有非常相似的要求,并且它运行得非常好(而且FAR比使用WPF提供的任何“禁止”方法更快)。

您可能需要熟悉多一点的DirectX(不太多,我保证!),但你可以看到它,并从他的博客点击这里下载工作的源代码:

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

+1

我曾经看过那篇文章,但从未设法让它起作用。您是否有样品,或者您是否知道需要采取措施来获取单个Viewport3D对象的内容。与此同时,我切换到.NET 4.0 – 2011-04-22 14:02:14