問題タブ [drawingvisual]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
wpf - マルチスレッド画像合成
WPF イメージングを使用して、DrawingVisual を使用してテキスト、3D グラフィックス、および画像を合成しています。結果は RenderTargetBitmap にレンダリングされ、jpeg としてディスクに保存されます。これらはすべて、ビジュアル ウィンドウのないコードで行われます。
一度に 1 つのことだけを実行しようとしている限り、うまく機能しています。ただし、複数のスレッドを使用してレンダリングを行うことで速度を上げることができるかどうかを確認したいと思います。各スレッドは、独自の DrawingContext、DrawingVisual などを作成するオブジェクトを使用します。ただし、並列にアクセスしようとすると誤ったエラーが発生するため、どこかに共有状態があることは明らかです。「別のスレッドが作成したため、呼び出し元のスレッドはこのオブジェクトにアクセスできません」という場合があります。また、たとえば 3D ジオメトリにポイントを追加しているときに、WPF の腸から NullReferenceExceptions が泡立ち、見た目が悪い場合もあります。
各スレッドが WPF で互いに離れていることを確認する方法はありますか? それとも共有状態は避けられないのでしょうか?
c# - DrawingContext の角度で DrawText?
したがって、次のコードを使用して、入力フォームから既存の画像とテキストを取得し、入力フォームからのテキストを既存の画像に配置して、新しい画像として保存しています。
ご覧のとおり、次の関数を呼び出してテキストを描画します。
今私が必要とするのは簡単です...中央の位置から角度を付けてtext2(およびtext2のみ)を描画する必要があります。中央の位置は単純です。次のようになります。
では、このテキストを、中心位置で回転させて -30 度の角度で描画したい場合はどうすればよいでしょうか? 他のテキストではなく、元の画像ソースでもなく、テキスト 2 のみを回転させたいことを覚えておいてください。
c# - DrawingVisual をビットマップに変換するにはどうすればよいですか?
Visual C# 2010 を使用して、Windows Kinect から受信したフレームから .avi ファイルを書き込もうとしています。フレームは、BitmapEncoder と PngBitmapEncoder (ストリームに保存) を使用して .png ファイルとして簡単に保存できますが、これらの画像をここで提供される VideoStream に自分の裁量で追加することはできません: http://www.codeproject. RenderTargetBitmap または DrawingVisual を System.Drawing.Bitmap に変換できるようにする必要があるためです。
同様のことを行うサンプルコードを見つけましたが、それらはすべて、Visual Studio が抽象的でインスタンス化できないと言った Image クラスをインスタンス化したいようです。
私はぐるぐる回っていて、どこにも行きません。
私はちょうどこのようなことをしたい:
しかし、Bitmap には、dv (DrawingVisual) から bmp に移行するための便利なコンストラクターがありません。:(
これらの 3 行は、次のスニペットから取得されます。
wpf - 一部のマシンでのWPFDrawingVisualのパフォーマンス
グリッド(1つのグリッド40x250と1つの250x250)の形で約70kの長方形を描画する必要があるアプリケーションを開発しています。一度にすべての長方形が画面に表示されるわけではありません。
http://msdn.microsoft.com/en-us/magazine/dd483292.aspxを読んだ後、DrawingVisual descantを使用して長方形の1つの列を作成する、単純なコントロール(FrameworkElementから継承、パーツは以下にリストされています)を作成しました。
すべてのブラシは凍結されており(Brushes
クラスのメンバー)、_strokePen
凍結されています。新しい縦縞が200msごとにコレクションに追加されます。
プログラムは3台のコンピューターで実行されました:
- ノートブック:i7-2670QM、GeForce GT 540M / Intel HD Graphics 3000、4GB RAM、Win7 x64、DirectX11、
- PC:Core2Duo E7400、Radeon HD 4800、3GB RAM、Win7 x64、DirectX11、
- PC:i3 3,07GHz、Inter HDグラフィックス、3.3GB RAM、Win7 x86、DirectX11。
問題は、私の最初のコンピュータープログラムがスムーズに実行され、CPUに大きな影響を与えないことです(使用率は1〜10%)。2番目と3番目のコンピューターの両方で、プログラムのパフォーマンスは許容できません。約30x100グリッドでは、プロセッサーの最大50%を使用し、すべての実行が非常に遅くなります。グリッドのごく一部しか表示されていない場合でも、プログラムの実行は遅くなります。
プログラムがソフトウェアレンダリングを使用しているように見えますが(レンダリングスレッドはプロセッサの50%を使用しています)、RenderCapability.Tier >> 16
2を返し、にRenderOption.ProcessRenderMode
設定されていDefault
ます。[HKCU/Software/Microsoft/Avalon.Graphics]
また、ハードウェアアクセラレーションを無効にするキーはありません。
このアプリケーションをスムーズにリストされたコンピューターで実行することは可能ですか?このプログラムのパフォーマンスを最大化するために他に何ができますか?
アップデート
設定DrawingVisual.CacheMode = new BitmapCache();
は大いに役立ちました。CPU <=> GPU通信がボトルネックだったということですか?
c# - BitmapCacheBrush - キャッシュ後にビジュアルを解放しますか?
何万もの要素 (長方形、線、円) をレンダリングする必要があるアプリケーションで使用するために WPF を評価しています。レンダリングは高速である必要がありますが、一度実行してキャッシュすることができます。そのため、BitmapCacheBrush がこれを行うための推奨される方法であることがわかりました。
ただし、DrawingVisual にレンダリングし、BitmapCacheBrush.Target を更新してこれを使用すると、DrawingVisual のメモリが保持されているようです。
ビットマップとしてキャッシュされた DrawingVisual を削除する方法はありますか? またはこれを行う別の方法は?(私は RenderTargetBitmap を見ましたが、ハードウェア アクセラレーション レンダリングを使用していないようです)
ありがとうアノンデヴ
wpf - ウィンドウ内の WPF キャンバスに DrawingVisual が表示されない
WPF で DrawingVisuals を使用して描画することを「始める」ために、最小限のプロジェクトを作成しました (これまでのところ非常に初心者です)。
私のプロジェクトには、メイン ウィンドウの XAML とコード ビハインドのみが含まれています。このプロジェクトの唯一の目的は、ウィンドウを開き、使用可能なスペースを満たす「信号ノイズ」を表示することです。
MainWindow.xaml は次のとおりです。
コードビハインドは次のとおりです。
問題は、ウィンドウが開いたときにキャンバスが期待どおりに中央に表示される (灰色の背景) が、信号がプロットされないことです。このコードの以前のバージョンはパス ジオメトリを使用して正常に動作しましたが、DrawingVisual ではジオメトリが表示されません (デバッグ用に含まれる楕円ジオメトリでさえありません)。
読んでくれてありがとう!
c# - DrawingVisual を継続的に削除および再追加すると、メモリ使用量が常に増加するのはなぜですか?
Canvas
a内で aを使用し、オーバーライドして a になる WPF プログラムがあります。これは次のようWindow
になります。Graphics_Canvas
(私はそれをオンラインのどこかから入手しましたが、少し前だったのでどこにあったか思い出せません。)
とにかく、このプログラムでは、ユーザーがGraphics_Canvas
中央のマウスでドラッグすることで、に表示されているグラフィックスをパンできます。これにより、(パンを続けている限り) 次のようなものが継続的にトリガーされます。
したがって、私は継続的に削除してから再度追加しdataVisual
ます。
メモリの使用状況を見て気づいたのは、パニングするとメモリの使用量が増加し、再び減少する一方で、以前の状態にはまったく戻らないということです。これは、ディスプレイに何も表示されていない場合はさらに顕著であり、事実上何も追加し直さないためのメモリ使用量は数百 MB に達する可能性があり、パンが停止するとほとんどが低下します。
詳細については、が描画される をGetDataDrawingVisual()
返すを追加する必要があります。これ自体は、そのメソッドの外部には保持されません。Visual
RenderTargetBitmap
私の質問は、なぜこれによりメモリ使用量が大きく変化するのですか?
現在のところ、これは興味深い厄介な問題ですが、最初から利用可能なメモリがもっと限られている場合は、問題になる可能性があると予測できます。
どんな洞察も大歓迎です。
* 更新 (2013 年 3 月 21 日) *
で実験したGraphics_Canvas
ところ、次の方法は解放されないメモリの量にかなりの影響を与えるようです。
テストとして代わりに aを返すと、new DrawingVisual()
再描画が終了した後、メモリはほとんど元の場所に戻ります。
ただし、このメソッドを削除すると、Canvas
が実行されなくなり、エラーが発生します。舞台裏のどこかで .NET がVisual
このメソッドから返された への参照を作成し、後で参照解除していない可能性がありますか? どうすればこれを並べ替えることができますか? (注: コードでこのメソッドを明示的に呼び出すことはありません。別の場所から呼び出されます)。
c# - wpf で DataGrid に列を動的に追加する
私は現在、カスタムキャンバスに取り組んでおり、その中でテーブルを追加する必要があるため、dataGrid は問題ないと思いました。SO i は、ユーザーが実行時にテーブルをキャンバスに追加できる「Datagrid」から「テーブル」を作成したいと考えています。
これまで、リストを使用して DataGrid を作成しようとしましたが、成功しました。
実行時にデータグリッドに列を追加するにはどうすればよいですか。実行時にテキストボックスを使用して列の数とヘッダー値がユーザーから取得され、テキストボックスの値に基づいてデータグリッドが列とヘッダー値を追加する必要があります。
実際には、ユーザーが列数と列ヘッダーを渡してテーブルを生成するテーブルを開発したいと考えています。
または
「DrawingVisual クラスを使用してテーブルを「描画」するために私が見るべき方法を提案してもらえますか」
GraphicsTable クラスの一部です
wpf - WPF: 何千もの子を持つ VisualHost をすばやくクリアする
WPF アプリケーションでは、Children コレクションで VisualHost を使用しています。この子コレクションには、約 10000 ~ 30000 の DrawingVisuals が含まれています。
これらの DrawingVisuals の描画には、約 600 ミリ秒かかります。それは私にとっては問題ありませんが、Clear() を介して Children コレクションをクリアするには、約 120 ミリ秒かかります。描画時間と比較して、それは私には非常に遅いようです。
Children コレクションのクリアを高速化する方法を知っている人はいますか?