2012-03-15 94 views
0

我正在收到byte[]图像数据(来自网络摄像头源,通过网络传输)并希望将其显示在我的WPF图像控件中。 如果我将分辨率设置为160x120,我会看到一个很好的小图像被显示出来。 对于任何其他决议,虽然我看到虚无,没有,zilch,蹲。将Image.Source设置为有效数据时未显示图像

如果我将原始字节写入磁盘,我可以看到数据确实是一个有效的jpg图像。 只是为了确保它不是jpeg不兼容我已经用png和bmp编码/解码测试了它,并得到了相同的结果;仍然没有图像。

任何人都有一个明智的想法?

private bool OnImage(byte[] inJpg) 
    { 
     this.Dispatch(() => 
      { 
       //File.WriteAllBytes("h:\\tmp\\test" + sImageNum++ + ".jpg", inJpg); 
       using (MemoryStream ms = new MemoryStream(inJpg)) 
       { 
        BitmapDecoder decoder = new JpegBitmapDecoder(ms, BitmapCreateOptions.None, BitmapCacheOption.Default); 
        ImageRemoteVideo.Source = decoder.Frames[0]; 
       } 
      } 
     ); 
    } 
+1

如果你写的图像到磁盘,然后设置您的来源为指向该文件,而不是对其进行解码的情况发生?不是将其作为一种解决方案,而是将其作为解决问题的可能手段。你能告诉我们你的XAML吗?那里有什么新奇的东西? – 2012-03-15 20:26:34

+0

XAML: <的ScrollViewer Grid.Row = “1” VerticalScrollBarVisibility = “自动” Horizo​​ntalScrollBarVisibility = “自动”> <图像弹力= “无” 名称= “ImageRemoteVideo”/> Pygmy 2012-03-15 20:53:20

+0

我只是试图创建将其UriSource设置为我写入磁盘的文件的BitmapImage,并将Image的源设置为该BitmapImage,然后工作正常。所以绝对不是图像/图像数据,设置图像的来源肯定会出错。 – Pygmy 2012-03-15 21:02:24

回答

2

假设ImageRemoteVideo是一个WPF图像控件的实例,您可能会通过一些懒惰的解决问题而陷入困境。 Image控件具有您应该使用的“BeginInit”和“EndInit”方法。在设置流之前放置BeginInit方法,在设置之后放置另一个方法。另外,如果我没有记错,Image类支持一个StreamSource。你可以尝试设置你的MemoryStream(不处理它,并且不使用JpegBitmapDecoder)到那个Property。如果可行,请查看您是否可以在EndInit调用之后处理它。

0

我刚刚找到了一种方法来使它工作,但我很喜欢它,如果有人能解释为什么它有效:) 首先,我使用原始字节流来创建一个BitmapImage。 但是 - 如果我在MemoryStream周围使用“using”子句,它不起作用,如果我不行的话。

所以这不起作用:

    using (MemoryStream byteStream = new MemoryStream(inJpg)) 
        { 
         BitmapImage image = new BitmapImage(); 
         image.BeginInit(); 
         image.StreamSource = byteStream; 
         image.EndInit(); 
         ImageRemoteVideo.Source = image; 
        } 

但这:

    MemoryStream byteStream = new MemoryStream(inJpg); 
        BitmapImage image = new BitmapImage(); 
        image.BeginInit(); 
        image.StreamSource = byteStream; 
        image.EndInit(); 
        ImageRemoteVideo.Source = image; 
0

发现了它。这就像布兰农说的延迟加载的情况。 指定“CacheOption = BitmapCacheOption.OnLoad;”修复它!

干杯!

工作版本:

    MemoryStream byteStream = new MemoryStream(inJpg); 
        { 
         BitmapImage image = new BitmapImage(); 
         image.BeginInit(); 
         image.StreamSource = byteStream; 
         image.CacheOption = BitmapCacheOption.OnLoad; 
         image.EndInit(); 

         ImageRemoteVideo.BeginInit(); 
         ImageRemoteVideo.Source = image; 
         ImageRemoteVideo.EndInit(); 
        }