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 对象上看到图像。所以我认为我增加了睡眠时间的问题,但即使图像没有刷新。可能是什么问题?

编辑:将更新图像的代码移动到另一个函数后,它工作正常。我使用 BeginInvoke() 而不是调用一切正常。

4

2 回答 2

0

前段时间我遇到了类似的问题,我在 Stackoverflow 上发现了这个问题,它为我解决了这个问题

第二个线程上的图像

WPF Dispatcher {“调用线程无法访问此对象,因为不同的线程拥有它。”}

如果您不打算在创建图像后对其进行修改,则可以使用 Freezable.Freeze 将其冻结,然后在调度程序委托中分配给 GeneratedImage(由于冻结,BitmapImage 变为只读,因此线程安全)。另一种选择是将图像加载到后台线程上的 MemoryStream 中,然后使用该流和 BitmapImage 的 StreamSource 属性在调度程序委托中的 UI 线程上创建 BitmapImage。

于 2012-04-12T06:18:26.037 回答
0

尝试使用Application.Current.Dispatcher而不是您使用的那个。我相信这会成功。

干杯

于 2012-04-12T06:22:33.213 回答