gpt4 book ai didi

c# - BitmapDecoder.CreateAsync(randomAccessStream);导致 "Component cannot be found"异常

转载 作者:太空宇宙 更新时间:2023-11-03 12:45:49 26 4
gpt4 key购买 nike

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

如果您检查 Position property img调用CapturePhotoToStreamAsync方法后,你会发现它的值不是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());

关于c# - BitmapDecoder.CreateAsync(randomAccessStream);导致 "Component cannot be found"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37366090/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com