我正在开发一个UWP应用程序,其中这个CameraHelper类将来自网络摄像头的捕获图像存储在以下行中:
MediaCapture.CapturePhotoToStreamAsync(ImageEncodingProperties.CreateBmp(), img);
其中img先前声明为img = new InMemoryRandomAccessStream();.
现在,因为我还需要将它存储到数据库中,我需要将它转换为字节数组 - 我这样做:
bytearray = new byte[img.Size];
await img.ReadAsync(bytearray.AsBuffer(), (uint) img.Size, InputStreamOptions.None);
现在,稍后在代码中,我尝试将此bytearray转换回InMemoryRandomAccessStream:
InMemoryRandomAccessStream randomAccessStream = new InMemoryRandomAccessStream();
await randomAccessStream.WriteAsync(img.AsBuffer());
randomAccessStream.Seek(0);
BitmapDecoder decoder = await BitmapDecoder.CreateAsync(randomAccessStream);
最后一行导致问题标题出现异常!有任何想法吗?我确信InMemoryRandomAccessStream很好,因为我实际上可以将它转换为SoftwareBitmapSource并且我正确地在屏幕上看到图像。
答案 0 :(得分:1)
要解决此问题,可以在将流转换为字节数组之前添加img.Seek(0);
。
如果您在调用img
方法后查看CapturePhotoToStreamAsync
的{{3}},则会发现其值不是0
。
Position
property
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());