BitmapDecoder.CreateAsync(randomAccessStream);原因"组件无法找到"例外

时间:2016-05-21 17:31:03

标签: c# uwp

我正在开发一个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并且我正确地在屏幕上看到图像。

1 个答案:

答案 0 :(得分:1)

要解决此问题,可以在将流转换为字节数组之前添加img.Seek(0);

如果您在调用img方法后查看CapturePhotoToStreamAsync的{​​{3}},则会发现其值不是0Position 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());