問題タブ [bitmapsource]
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/BackgroundWorker と BitmapSource の問題
私は WPF の初心者であり、技術に慣れるためにホーム プロジェクトを試みています。ユーザーが画像ファイルを選択する単純なフォームがあり、画像のサムネイルと共に EXIF データを表示します。これは問題なく動作していますが、RAW 画像ファイル (~9 MB) を選択すると、サムの読み込み中にわずかな遅延が発生する可能性があるため、BackgroundWorker を使用して画像をデコードし、ユーザーが EXIF データを表示できると考えました。画像がデコードされると表示されます。
BitmapSource オブジェクトは、BackgroundWorkers の DoWork メソッドで宣言されています。
私が実行している問題は、RunWorkerCompleted メソッドで Image コントロールのソースを設定しようとすると、オブジェクトが別のスレッドによって所有されているためにエラーが発生することです。
メソッドを使用してソースを設定しようとしましたimgThumb.Dispatcher.BeginInvoke()
が、これもうまくいきませんargs.Result
でした。imgThumb
どうすればこれを回避できますか?
Dispatcher を間違ってコーディングしていた可能性があります (以下は記憶によるもので、持っていたものを削除しました)。
提案やアイデアは大歓迎です。
アップデート
DoWork メソッドを .DelayCreation ではなく BitmapCreateOptions.None を使用するように変更しましたが、RAW ファイルをロードするときに次のエラーが発生するようになりました (これまでにテストしたのは Canon .CR2 ファイルだけです)。コードは jpg に対して正常に動作します。これは、RAW ファイルを表示できるようにインストールした Canon コーデックの問題でしょうか?
アプリケーションは、別のスレッド用にマーシャリングされたインターフェースを呼び出しました。(HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))
c# - BitmapSourceとBitmapの間で変換する良い方法はありますか?
BitmapSourceからBitmapに変換する唯一の方法は、安全でないコードを使用することです...このように(Lesters WPFブログから):
逆にするには:
フレームワークにもっと簡単な方法はありますか?そして、それがそこにない理由は何ですか(そうでない場合)?かなり使いやすいと思います。
これが必要な理由は、AForgeを使用してWPFアプリで特定の画像操作を実行するためです。WPFはBitmapSource/ImageSourceを表示したいのですが、AForgeはビットマップで動作します。
c# - InteropBitmapからBitmapImageへ
WPFイメージコントロールで使用できるように、Bitmap (SystemIcons.Question)
をに変換しようとしています。BitmapImage
私はそれをに変換する次のメソッドを持っていBitmapSource
ますが、それはを返しますInteropBitmapImage
、今問題はそれをに変換する方法BitmapImage
です。直接キャストは機能しないようです。
誰かがそれを行う方法を知っていますか?
コード:
BitmapImageを返すプロパティ:(私の画像コントロールにバインドされています)
wpf - WPF BitmapSource をウィンドウのアイコンに変換する
ImageSource (BitmapSource) としてロードした 16x16 の .png ファイルがあり、タブコントロール ヘッダーの画像で使用すると正常に動作します。
ユーザーがドキュメント タブをドラッグしたときに、(WPF Window クラスから継承された) フローティング ウィンドウで同じ画像を使用したいと考えています。(これは、タブ ヘッダーに画像を表示できるように調整した AvalonDock です)
Web で多くの検索を行った結果、Window.Icon には BitmapFrame が必要であることがわかりましたが、すべてのサンプル コードは .ico ファイルが利用可能であると想定しているようですが、私の場合はそうではありません。
次のコードを試しました(さらに、クローン作成、凍結などのバリアントも):
ただし、Show() メソッドが呼び出されると、「'System.ExecutionEngineException' 型の例外がスローされました」という例外がスローされます。
ウィンドウがアイコンを表示できるように、互換性のあるビットマップをオンザフライで作成するにはどうすればよいですか?
c# - DispatcherObject (BitmapSource) を別のスレッドにコピーする方法は?
DispatcherObject (私の場合は BitmapSource) を別のスレッドにコピーする方法を見つけようとしています。
ユース ケース:
新しいスレッドでウィンドウを表示する必要がある WPF アプリがあります (アプリは実際には Outlook アドインであり、Outlook のメイン UI スレッドにいくつかのフックがあり、使用する必要がある特定のホットキーを盗んでいるため、これを行う必要があります。 - Outlook、WPF (UI に使用)、および Winforms (Microsoft が提供する特定の winforms コントロールを使用する必要があります) の相互運用における「翻訳で失われた」。
これで、いくつかの静的プロパティを設定することで構成された WPFMessageBox の実装ができました。そのうちの 1 つはアイコンの BitmapSource です。これは、起動時に WPFMessageBox.Icon を一度設定できるようにするために使用され、それ以降、すべての WPFMessageBox が同じアイコンを持つようになります。
問題は、icon に割り当てられている BitmapSource が DispatcherObject であり、読み取り時に InvalidOperationException をスローすることです: "別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。".
その BitmapSource を実際のスレッドに複製するにはどうすればよいですか? Clone() および CloneCurrentValue() メソッドがありますが、機能しません (同じ例外がスローされます)。originalIcon.Dispatcher.Invoke( ここでクローンを作成する ) を使用することも思いつきましたが、BitmapSource の Dispatcher は null であり、それでも - 間違ったスレッドでコピーを作成し、それを自分では使用できませんでした。BitmapSource.IsFrozen == true。
BitmapSource を別のスレッドにコピーする方法についてのアイデアはありますか (新しいスレッドのイメージ ファイルから完全に再構築せずに)。
編集: したがって、フリーズは役に立ちません:最終的には BitmapFrame (Window.Icon は他の種類の ImageSource を取りません) を持っています。 、私は InvalidOperationException を取得します:「別のスレッドが所有しているため、呼び出し元のスレッドはこのオブジェクトにアクセスできません。」次のスタック トレースを使用します。
wpf - WPF BitmapSource イメージをファイルに保存するには?
WPF では、System.Windows.Clipboard.getImage()
関数はオブジェクトを返しBitmapSource
ます。WinForms の背景を持つ WPF の初心者として、この画像をファイルに保存する方法がわかりません。どのような手順を踏む必要がありますか?
wpf - WPF でのバイト配列からの画像の表示 - メモリの問題
画像をキャプチャしてデータベースに保存するアプリケーションを開発しましたが、メモリ使用量に問題があります。私のドメイン オブジェクトには、3 つのプロパティがあります。
画像 - バイト配列、内容は jpg
RealImageThumb - BitmapImage に変換されて縮小されたバイト配列で、他のサムネイルと共にグリッドビューでユーザーに表示されます
RealImage - ビットマップ ソースに変換されたバイト配列であり、ユーザーがカーソルを合わせるとツールチップに表示されます。
私が抱えている問題は、ユーザーが各画像にカーソルを合わせると、メモリ使用量がスパイラルになることです。ユーザーが生成されたビットマップ ソースにカーソルを合わせてもメモリが解放されないことに気付きました。RealImage にバッキング プロパティを与え、これを null に割り当てようとしましたが、メモリは解放されません (ガベージを待っています)。コレクタ?)。
編集:
レイのことですか?以下のようにツールチップに何も表示されWeakReference<BitmapImage>
ませんが、 を定義しようとすると、System.WeakReference に型パラメータがありませんというエラーが表示されます。
wpf - WPFで既存のBitmapSourceに線を引く方法は?
WPF アプリケーションの既存の BitmapSource オブジェクトに線 (または任意の幾何学的形状) を描画したいと考えています。それを行う最良の方法は何ですか?
BitmapSource は BitmapSource.Create(...) 呼び出しの結果です。
ありがとう
- ロマン
c# - C# で空の BitmapSource を作成する
c# で空 (0x0 px または 1x1 px で完全に透明)の BitmapSourceインスタンスを作成する最速 (数行のコードと低リソース使用) の方法は何ですか?
c# - 別のスレッドから「安全でない」メモリ内のWPF BitmapSourceを変更することは可能ですか?
WPF アプリケーションで画像を処理したいと考えています。ただし、実行時にメモリ内の BitmapSource のピクセルを変更したいと思います。
私は現在、昔ながらの System.Drawing.Bitmap に対して「安全でない」コードを使用してこれを行うことに成功しています。このアプローチは、次の投稿で説明されています。
これを WPF で機能させるために、次のアプローチを使用して WPF BitmapSource を作成しています。
ただし、これによりメモリ内に多くのコピーが作成されるため、EricGu がビットマップの例で示したように、そこにアクセスして BitmapSource 内の基になるビットをいじりたいと思っています。これは可能ですか?
PixelShaders はおそらくこれを行うことができると認識していますが、これは複数のスレッドを含む学術的な演習です (これは、ビットマップをアンセーフ モードで編集するときにサポートされます)。
前もって感謝します