私は WPF の初心者であり、技術に慣れるためにホーム プロジェクトを試みています。ユーザーが画像ファイルを選択する単純なフォームがあり、画像のサムネイルと共に EXIF データを表示します。これは問題なく動作していますが、RAW 画像ファイル (~9 MB) を選択すると、サムの読み込み中にわずかな遅延が発生する可能性があるため、BackgroundWorker を使用して画像をデコードし、ユーザーが EXIF データを表示できると考えました。画像がデコードされると表示されます。
BitmapSource オブジェクトは、BackgroundWorkers の DoWork メソッドで宣言されています。
worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
string filePath = args.Argument as string;
BitmapDecoder bmpDecoder = BitmapDecoder.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.None);
BitmapSource bmpSource = bmpDecoder.Frames[0];
bmpSource.Freeze(); //As suggested by Paul Betts
args.Result = bmpSource;
};
私が実行している問題は、RunWorkerCompleted メソッドで Image コントロールのソースを設定しようとすると、オブジェクトが別のスレッドによって所有されているためにエラーが発生することです。
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
imgThumb.Source = args.Result as BitmapSource;
};
メソッドを使用してソースを設定しようとしましたimgThumb.Dispatcher.BeginInvoke()
が、これもうまくいきませんargs.Result
でした。imgThumb
どうすればこれを回避できますか?
Dispatcher を間違ってコーディングしていた可能性があります (以下は記憶によるもので、持っていたものを削除しました)。
imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
delegate(BitmapSource src)
{
imgThumb.Source = src;
}
), bmpSource);
提案やアイデアは大歓迎です。
アップデート
DoWork メソッドを .DelayCreation ではなく BitmapCreateOptions.None を使用するように変更しましたが、RAW ファイルをロードするときに次のエラーが発生するようになりました (これまでにテストしたのは Canon .CR2 ファイルだけです)。コードは jpg に対して正常に動作します。これは、RAW ファイルを表示できるようにインストールした Canon コーデックの問題でしょうか?
アプリケーションは、別のスレッド用にマーシャリングされたインターフェースを呼び出しました。(HRESULT からの例外: 0x8001010E (RPC_E_WRONG_THREAD))