WPF图像源未从流加载

时间:2014-04-18 12:35:53

标签: c# wpf wcf image-processing

我有WCF服务来捕获网络摄像头图像并发送给客户端,它在我的WinForms应用程序中运行良好。我决定创建WPF客户端应用程序。

我有代码:

void timer1_Tick(object sender, EventArgs e)
{
       counter++;
       try
       {
            Stream imageStream = client.GetImage();
            using (MemoryStream stream = new MemoryStream())
            {
                imageStream.CopyTo(stream);
                int size = (int)stream.Length;
                cam_img.Source = BitmapFrame.Create(stream,
                                                  BitmapCreateOptions.None,
                                                  BitmapCacheOption.OnLoad);
            }
            System.Diagnostics.Debug.WriteLine(counter);
       }
       catch (System.ServiceModel.CommunicationException ex)
       {
            if (ex.InnerException is System.ServiceModel.QuotaExceededException)
            {

            }
            else
            { 
                throw ex;
            }

       }
       catch (System.Exception ex)
       {

       }
}

cam_img是一个图像控件。在调试器模式下,我看到该流包含数据,但cam_img.source在每个tick事件中都是null

接下来的问题是,我是否必须实现propertychanged事件以与图像进行动态绑定?或者在每个计时器中分配给cam_img.source,这足以看到动态改变控制?

1 个答案:

答案 0 :(得分:1)

问题2:

不,您需要PropertyChanged,您只需在每个计时器刻度中指定cam_img.Source属性即可。 请确保您在用户界面线程中设置cam_img.Source,否则您将获得InvalidOperationException类似的内容:

  

调用线程无法访问此对象,因为它不同   线程拥有它。

问题1:

如果您的imageStream包含数据,并且您更喜欢MemoryStream, 那么你应该在调用stream.Seek(0, SeekOrigin.Begin);之前调用BitmapFrame.Create移动位置。

当前代码在创建BitmapFrame时会导致异常,并且异常被捕获,这就是为什么cam_img.Source永远不会被设置,并且仍然是默认的'null'值。