問題タブ [rendertargetbitmap]

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.

0 投票する
3 に答える
1081 参照

wpf - wpf Web サーバー上の Viewport3D の RenderTargetBitmap (オフスクリーン)

Viewport3D (CurViewport3D) オフスクリーンを作成し、(テスト目的で) 1 つの平面だけで埋めます。

RenderTargetBitmap と BitmapEncoder を介して、このビューポートのコンテンツ (jpg として) の MemoryStream が作成されます。Web サーバーでこのライブラリを使用して、Web サイトに表示する画像を作成したいので、機能全体をライブラリ (dll) に入れます。

以下のコードは基本的なものに縮小されていますが、機能しています。

ここにウェブサイトのコードがあります:

および背後にあるコード:

とても簡単!

問題: ローカルではすべて正常に動作します。ブラウザに画像が表示されます - 完璧です。Web サーバー (Microsoft Server 2008) で実行しようとすると、ブラウザーに表示される画像は空で、コンテンツがありません。エラーなし。

Webサーバーで実行する方法を知っている人はいますか?

0 投票する
3 に答える
1137 参照

wpf - マルチスレッド画像合成

WPF イメージングを使用して、DrawingVisual を使用してテキスト、3D グラフィックス、および画像を合成しています。結果は RenderTargetBitmap にレンダリングされ、jpeg としてディスクに保存されます。これらはすべて、ビジュアル ウィンドウのないコードで行われます。

一度に 1 つのことだけを実行しようとしている限り、うまく機能しています。ただし、複数のスレッドを使用してレンダリングを行うことで速度を上げることができるかどうかを確認したいと思います。各スレッドは、独自の DrawingContext、DrawingVisual などを作成するオブジェクトを使用します。ただし、並列にアクセスしようとすると誤ったエラーが発生するため、どこかに共有状態があることは明らかです。「別のスレッドが作成したため、呼び出し元のスレッドはこのオブジェクトにアクセスできません」という場合があります。また、たとえば 3D ジオメトリにポイントを追加しているときに、WPF の腸から NullReferenceExceptions が泡立ち、見た目が悪い場合もあります。

各スレッドが WPF で互いに離れていることを確認する方法はありますか? それとも共有状態は避けられないのでしょうか?

0 投票する
3 に答える
4525 参照

c# - DrawingContext から Bitmap ファイルへ

DrawingContext (Visual または DrawingGroup の一部) があり、そこで多数の四角形や 1 ビット イメージを重ねて描画します。マスキング 1 ビット イメージと考えてください。これをビットマップ画像ファイルに変換したいと思います。

RenderTargetBitmap32 ビット ピクセル形式でしかレンダリングできないため、使用はオプションではありません。そのため、20 MB の 1 ビット イメージをレンダリングする必要がある場合、ヒープに 640 MB (20*32) のメモリが必要になります。もちろん、これは壮大な LOH フラグメンテーションを作成し、アプリケーションは 2 回目のショットでメモリ不足になります。

したがって、基本的には、描画コンテキストから 1 ビットのビットマップ ファイルを効率的に書き込む方法が必要です。アイデア/提案/代替方法をいただければ幸いです。

0 投票する
2 に答える
2534 参照

c# - RenderTargetBitmap と VisualBrush をうまく連携させるにはどうすればよいですか?

私の要件:

  • UserControlマップや描画などのカスタム イメージのロジックを処理する永続
  • ズームまたはパンの移動中に画像にキャッシュを実装するためのコンテナーのセット
  • VisualBrushUserControlエフェクトで使用するコンテナに追加できるのコピー

現在、RenderTargetBitmap を使用してイメージ キャッシングを実装していますが、使用しているVisualBrush-coveredRectangleオブジェクトに問題があるようです。

私の質問VisualBrush:オブジェクトを使用した後にオブジェクトを正しくレンダリングするには、このコードに何を追加/変更できRenderTargetBitmapますか? 目に見えないようRenderTargetBitmapにする奇妙なことは何ですか?VisualBrush

これは、かなりの量のコードがなければ再現できなかった問題です。

私のxamlファイルには次のものがあります:

および .xaml.cs:

コードに関するいくつかのヘルプ ノート:

  • xaml は_contentContainerと連携しHardCopy()て、現在の画像を画像キャッシュにコピーします_back
  • SoftCopy過去のものとまったく同じように見えるが、変換、効果、または視覚的な親がない FrameworkElement を返します。これはとても重要です。
  • BuildImage初期画像が何らかの形で変換された後、キャッシュに貼り付けられる新しい画像の作成をシミュレートします。

SoftCopy()から を削除してアプリケーションをビルドして実行すると、目的_body.Children.Add(SoftCopy(Control));の効果が得られます。新しい要素が古い要素の上に貼り付けられ、古い要素がその変換を保持しているように見えます。

var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);または、から行を切り取るHardCopyと、キャッシュ機能は壊れますが、SoftCopy は正しく表示されます。

ただし、アプリケーションをそのまま実行すると、新しい BlueRectangle (VisualBrush を介してレンダリングされたもの) がまったく表示されないことがわかります。これは、[新規] ボタンをもう一度押して画像をキャッシュにプッシュし、それでもなお新しく作成された画像が表示されません。

0 投票する
1 に答える
495 参照

wpf - WPF キャンバスを特定のサイズのビットマップとしてレンダリングする

ビットマップを作成したい WPF Canvas があります。

具体的には、300dpi ビットマップで実際のサイズでレンダリングしたいと考えています。キャンバス上のオブジェクトの「実際のサイズ」は、実際には 10デバイスに依存しないピクセル= 1" です。理論的には、WPF デバイスに依存しないピクセルは 96dpi です。

私はこれを機能させるために何日も費やしてきましたが、困惑しています。

私の理解では、一般的な手順はおおよそ次のとおりです。

また、キャンバスの LayoutTransform を ScaleTransform の ?SomeOtherFactor? に設定する必要があります。次に、キャンバスの測定と配置を ?SomeDesiredSize? に行います。

私が立ち往生しているのは、?SomeFactor?、?SomeOtherFactor? の値に何を使用するかです。と?SomeDesiredSize? これを機能させるために。 MSDN のドキュメントには、どの要素を使用するべきかが示されていません。

0 投票する
2 に答える
23247 参照

c# - RenderTargetBitmap を BitmapImage に変換する

があります。RenderTargetBitmapに変換する必要がありBitmapImageます。以下のコードを確認してください。

上記のコードでは、Image を使用しました。次に、BitmapImage を使用する必要があります。これどうやってするの?

0 投票する
2 に答える
15951 参照

wpf - RenderTargetBitmapを使用したWPFキャンバス領域のスナップショット

アプリケーションでキャンバス領域のスナップショットを作成したいと思います。ビジュアルブラシを使用してスナップショットを取得し、PngEncoderを使用して同じものを保存しています。しかし、結果のPNGは空の黒い画像にすぎません。問題が作成されたBitmapSourceまたはPNGEncoderの問題にあるかどうかはわかりません。これが私が同じものを取得するために使用しているコードです。

0 投票する
1 に答える
2954 参照

c# - Windows.Media.Drawing を BmpBitmapEncoder の黒い画像で保存する - アルファを削除するには?

SVG# ( http://sharpvectors.codeplex.com/ ) を使用して、SVG ファイルを他の形式にバッチ変換しています。変換される SVG 画像は、背景のない黒い線画です。私は WPF または System.Windows.Media 名前空間の経験がほとんどないため、これが基本的な質問である場合はご容赦ください。

私は SVG# の ImageSvgConverter の修正版を使用してい System.Windows.Media.Drawingます。これはオブジェクトを受け入れ、エンコーダー ( など) を使用して変換されSystem.Windows.Media、目的のファイル形式にエクスポートされます。BmpBitmapEncoderPngBitmapEncoder

を使用してエクスポートするとTiffBitmapEncoderorPngBitmapEncoder またはGifBitmap画像が期待どおりに生成されます。生成された画像はすべて透明な背景を持っています。

ただし、JpegBitmapEncoderまたはを使用してエクスポートするとBmpBitmapEncoder、すべての画像が黒くなります。tif、png、gif はすべて透明な背景を持っているため、jpg / bmp 画像は正しく描画されていると思いますが、これらのファイル形式ではアルファがサポートされていないため、透明度が解釈されるため、出力を黒にすることは理にかなっています。何もない/黒として。

これは、これらの SO 投稿で説明されているとおりだと思います。BitmapSource からの奇妙な bmp 黒出力 - アイデアはありますか? 透明な PNG を黒以外の背景色の JPG に変換し、ビットマップを保存すると背景が黒くなります - C# .

ただし、これらの投稿が私の問題に解決策を適用する方法がわかりません。誰かが私を正しい方向に向けることができますか?

DrawingContext の PushOpacityMask メソッドに白い SolidColorBrush を適用しようとしましたが、違いはありません。

本当にありがとうございました。

0 投票する
1 に答える
2632 参照

wpf - RenderTargetBitmapを使用したWPFメモリリーク?

WPFコードのメモリリークに少し困惑しています。いくつかの3DジオメトリをいくつかのRenderTargetBitmapにレンダリングしてから、それぞれを大きなマスターRenderTargetBitmapにレンダリングしています。しかし、これを行うと、メモリリークが発生し、わずか1〜2分後にアプリがクラッシュします。

次の簡略化されたコードでエラーを再現しました。

誰かがここでうまくいかない明らかな何かを見ることができますか?このコードでひどいメモリリークが発生するのはなぜですか?

0 投票する
2 に答える
2025 参照

wpf - WPF RenderTargetBitmap 欠落要素

データ テンプレートに小さなアイコンが表示された TreeView があります。RenderTargetBitmap を使用して Treeview を PNG として保存しようとしています。

イメージは小さなデータ セットで正しく保存されます。ただし、データ セットが大きくなりすぎると、一部のアイコンが最終イメージから除外されます。マジックナンバーは200アイテムらしい。ツリーが深いか広いかは関係ないようです。200 個のアイテムの後、アイコンはレンダリングされません。

追加されたコード

これが、画像を作成するために使用している私のコードです。

スクリーンショットを追加

ツリーの右側にアイコンが表示されていないことに注意してください。 欠落しているアイコンのスクリーン ショット

ここで、いくつかのブランチを折りたたんで他のアイコンの一部を非表示にすると、これらのアイコンが含まれます。RenderTargetBitmap.Render には、すべてのアイコンをレンダリングする機能がありません。または、仮想パネルと関係があるかもしれません。 含まれているアイコンのスクリーンショット

ここで詳しく見てみましょう。 ここに画像の説明を入力