2016-05-21 28 views
1

我在UWP應用程序的工作,其中從攝像頭與線存儲所拍攝的圖像此CameraHelper類:BitmapDecoder.CreateAsync(randomAccessStream);導致「組件不能被發現」異常

MediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateBmp(), img); 

凡IMG事先聲明爲IMG =新InMemoryRandomAccessStream( );. - 現在

,因爲我也需要這個存儲到數據庫中,我需要它轉換成字節數組,我這樣做:

bytearray = new byte[img.Size]; 
await img.ReadAsync(bytearray.AsBuffer(), (uint) img.Size, InputStreamOptions.None); 

現在,在後面的代碼,我嘗試這個字節組轉換回到InMemoryRandomAccessStream與:

InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); 
await randomAccessStream.WriteAsync(img.AsBuffer()); 
randomAccessStream.Seek(0); 
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream); 

最後一行導致從問題的標題異常!有任何想法嗎?我確信InMemoryRandomAccessStream沒問題,因爲我實際上可以將它轉換爲SoftwareBitmapSource,並且正確地在屏幕上看到了圖像。

+0

你能告訴你要實現的目標是什麼?如果'img'是一個* Straem *,爲什麼不簡單地使用'BitmapDecoder decoder = await BitmapDecoder.CreateAsync(img);'? – Romasz

+0

我試圖將IMG保存的圖像存儲到數據庫中,這意味着我需要將它轉換爲字節數組,然後(從數據庫中檢索時)將其重新轉換回InMemoryRandomAccessStream,以便我可以將其顯示爲位圖。 –

+1

所以第二部分只是爲了從數據庫中讀取圖像。你看過[這篇文章](https://marcominerva.wordpress.com/2013/04/15/how-to-convert-a-byte-array-to-image-in-a-windows-store -app /)? – Romasz

回答

1

要解決此問題,可以在將流轉換爲字節數組之前添加img.Seek(0);

如果您在撥打CapturePhotoToStreamAsync方法後檢查您的imgPosition property,您會發現它的值不是0
enter image description here

Position是流的字節偏移量。如果我們不將它設置爲零,我們將得到一個錯誤的字節數組,它不能被轉換回原始數據流。當我們在BitmapDecoder.CreateAsync方法中使用錯誤的流時,我們會得到異常。

所以,你可以使用一些代碼,就像下面來獲取字節數組:

MediaCapture captureManager = new MediaCapture(); 

InMemoryRandomAccessStream img = new InMemoryRandomAccessStream(); 
... 

await captureManager.CapturePhotoToStreamAsync(Windows.Media.MediaProperties.ImageEncodingProperties.CreateBmp(), 
img); 

System.Diagnostics.Debug.WriteLine(img.Position); 
img.Seek(0); 

var bytearray = new byte[img.Size]; 
await img.ReadAsync(bytearray.AsBuffer(), (uint)img.Size, InputStreamOptions.None); 

然後你就可以將它轉換回來就好:

InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream(); 
await randomAccessStream.WriteAsync(bytearray.AsBuffer()); 
相關問題