2010-08-09 101 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