0

さて、wpf 画像オブジェクトがあり、ライブ画像が表示されます。そのため、タイマーを使用して画像を更新しました。

    public void LoadLiveImage()
        {

System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24;
                    int stride = 4 * ((24 * cameraFrame.img_width + 31) / 32); 
                     BitmapSource bmpImage=  BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride);
                    RemoteCameraImage.Source = bmpImage;
}

 void dispatcherTimer_Tick(object sender, EventArgs e)
        {
             LoadLiveImage();           

        }

問題ありません。これは正常に機能しています。しかし、これをスレッドに移動しようとしましたが、画像が表示されません。

 private void showLiveImage()
        {
                while (this.isCameraViewOpen)
                {
                 if (RemoteCameraImage.Dispatcher.CheckAccess())
                        {
                            System.Windows.Media.PixelFormat pf = PixelFormats.Bgr24;
                            int stride = 4 * ((24 * cameraFrame.img_width + 31) / 32); 
                            BitmapSource bmpImage = BitmapSource.Create(cameraFrame.img_width, cameraFrame.img_height, cameraFrame.img_width, cameraFrame.img_height, pf, null, cameraFrame.img_pixel, stride);
                            RemoteCameraImage.Source = bmpImage;

                            System.Threading.Thread.Sleep(5);
                        }
                        else
                            this.RemoteCameraImage.Dispatcher.Invoke(DispatcherPriority.Normal, new ImageUpdater(this.showLiveImage));

                    }

}

showLiveImage はスレッドとして実行されています。画像は受信しており、問題ありません。img_pixel 配列を bmp ファイルに保存してテストしたところ、ファイルが生成されました。画像が表示されないだけです。そこで、ソースが割り当てられた後に表示されるメッセージボックスを配置すると、 Image オブジェクトで画像を見ることができます。SOスリープ時間を増やしたのが問題だと思いますが、画像もリフレッシュされません。何が問題になる可能性がありますか?

編集:画像を更新していたコードを別の関数に移動した後、正常に動作します。そして、すべて正常に動作するように呼び出す代わりに、BeginInvoke() を使用しました。

4

2 に答える 2

0

少し前に私は同様の問題を抱えていました.Stackoverflowでこれを見つけました。

2番目のスレッドの画像

WPF Dispatcher {"別のスレッドが所有しているため、呼び出しスレッドはこのオブジェクトにアクセスできません。"}

一度作成したイメージを変更するつもりがない場合は、Freezable.Freeze を使用してイメージをフリーズし、ディスパッチャ デリゲートで GeneratedImage に割り当てることができます (BitmapImage は読み取り専用になり、Freeze の結果としてスレッドセーフになります)。もう 1 つのオプションは、バックグラウンド スレッドでイメージを MemoryStream にロードし、そのストリームと BitmapImage の StreamSource プロパティを使用して、ディスパッチャ デリゲートの UI スレッドで BitmapImage を作成することです。

于 2012-04-12T06:18:26.037 に答える
0

使用したものの代わりにApplication.Current.Dispatcherを使用してみてください。これでうまくいくと思います。

乾杯

于 2012-04-12T06:22:33.213 に答える