2014-04-18 42 views
0

我有WCF服务捕捉摄像头图像并发送到客户端,它在我的WinForms应用程序中效果很好。我决定创建WPF客户端应用程序。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.sourcenull

接下来的问题是,我必须实现propertychanged事件,使图像动态绑定?或者在每个计时器中分配到cam_img.source刻度足以看到控制上的动态变化?

+1

什么是'img_cam'? – terry

+0

抱歉,每个滴答事件中cam_img.source都为null。它似乎有点不正确的bitmapfram.create,因为流包含数据 –

+0

@ user3197850请回答问题 – csharpwinphonexaml

回答

1

问题2:

不,你需要PropertyChanged,你可以分配在每个时钟滴答的cam_img.Source财产。 请确保你在UI线程设置cam_img.Source,否则你会得到一个InvalidOperationException说是这样的:

,因为不同的 线程拥有它调用线程不能访问该对象。

问题1:

如果imageStream包含的数据,以及你喜欢的MemoryStream, 那么你应该叫stream.Seek(0, SeekOrigin.Begin);调用BitmapFrame.Create之前移动位置回来。创建BitmapFrame

您当前的代码将导致异常,并且异常被捕获,所以这就是为什么cam_img.Source从未设置,并且仍然是默认的“空”的值。

+0

我回答,这是错误的,即时通讯谈论cam_img.source,而不是img_cam。 –

+0

尝试'stream.Seek(0,SeekOrigin.Begin);''我认为这是因为你的'stream.Position'在'imageStream.CopyTo(stream)后面的文件末尾;' – terry

+0

真的很感谢, ! –