2012-03-15 30 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(); 
        }