4

私が構築した WPF アプリケーションには、あらゆる種類の UIElement3D オブジェクトを含む Viewport3D があります。今、特定のビューの高解像度スナップショットをファイルに保存したいと考えています。過去に RenderTargetBitmap を試したことがありますが、次の欠点があるため、このアプローチは好きではありません。

  • メモリ リーク (少なくとも .NET 3.5 SP1 では)。ただし、4.0 で解決されるはずですが、まだテストしていません。
  • アンチエイリアシングとピクセル シェーダを使用すると、ソフトウェア レンダリングはハードウェア レンダリングと同じ結果になりません。
  • RenderTargetBitmap は、画面に表示するのに数分の 1 秒かかるのではなく、画像を形成するのに多くの時間 (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 に答える