5

私は 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))

4

2 に答える 2

8

BitmapSource で Freeze() を呼び出すと、この問題は発生しません (フリーズするとスレッドの制限が取り除かれますが、オブジェクトは不変になります)。

于 2010-01-24T19:45:28.080 に答える
2

私はまさにサンプル問題を抱えていて、それを解決できて幸運でした。

簡単な答え: で囲みWriteableBitmapます。それには少し代償が伴います。

長い答え

于 2011-12-14T18:43:26.037 に答える