【问题标题】:BitmapDecoder.CreateAsync(randomAccessStream); causes "Component cannot be found" exceptionBitmapDecoder.CreateAsync(randomAccessStream);导致“找不到组件”异常
【发布时间】:2016-05-27 16:42:18
【问题描述】:

我正在开发一个 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);

现在,稍后在代码中,我尝试将这个字节数组转换回 InMemoryRandomAccessStream:

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

最后一行导致问题标题出现异常!有任何想法吗?我确信 InMemoryRandomAccessStream 很好,因为我实际上可以将它转换为 SoftwareBitmapSource,并且我可以正确地看到屏幕上的图像。

【问题讨论】:

  • 你能说出你想要达到的目标吗?如果img 是一个Straem,为什么不直接使用BitmapDecoder decoder = await BitmapDecoder.CreateAsync(img);
  • 我正在尝试将 img 保存的图像存储到数据库中,这意味着我需要将其转换为字节数组,然后(从数据库中检索时)将其重新转换回 InMemoryRandomAccessStream 所以我可以将其显示为位图。
  • 所以第二部分只是用于从数据库中读取图像。你看过at this post吗?

标签: c# uwp


【解决方案1】:

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

如果你在调用CapturePhotoToStreamAsync方法后检查imgPosition property,你会发现它的值不是0

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());

【讨论】:

    猜你喜欢
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-05-16
    • 2017-06-28
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多