c# - 使用 MediaCapture 时纵横比/缩放级别发生变化的问题?

标签 c# wpf uwp windows-10

我正在使用 MediaCapture连同 CapturePreview在 Surface Pro 平板电脑上创建预览流。我使用定时器定期拍照

CapturePhotoToStreamAsync()

但无论何时拍摄照片,预览流都会稍微缩小,就好像它正在改变分辨率或纵横比或类似的东西一样。

我找到了 this issue ,这听起来完全一样,但无论设置何种分辨率,我似乎都无法解决它。

这是我必须从流中获取 Bitmap 对象的代码:

using (var randomAccessStream = new InMemoryRandomAccessStream())
{
    await mediaCap.CapturePhotoToStreamAsync(imageProps, randomAccessStream);

    randomAccessStream.Seek(0);
    using (var ioStream = randomAccessStream.AsStream())
    {
        BitmapImage bitmapImage = new BitmapImage();
        bitmapImage.BeginInit();
        bitmapImage.StreamSource = ioStream;
        bitmapImage.CacheOption = BitmapCacheOption.OnLoad;
        bitmapImage.EndInit();
        bitmapImage.Freeze();
    }
}

imageProps 设置为 1280x720,与预览对象的分辨率相同。如果只是偶尔发生,这不会是一个大问题,但我需要经常抓取帧(每秒多次),而且它看起来非常不和谐。

编辑:

需要注意的是,该问题仅出现在上述 Surface Pro 平板电脑 (2736x1824 @200%) 上,似乎不会出现在 1920x1080 屏幕上。

最佳答案

我最终找到的解决方案是这样的改变:

来自:

await _mediaCaptureObject.InitializeAsync(new MediaCaptureInitializationSettings
{
    VideoDeviceId = deviceList?.FirstOrDefault(x => x.Name.Contains("Camera Name"))?.Id,
    StreamingCaptureMode = StreamingCaptureMode.Video
});

收件人:

await _mediaCaptureObject.InitializeAsync(new MediaCaptureInitializationSettings
{
    VideoDeviceId = deviceList?.FirstOrDefault(x => x.Name.Contains("Camera Name"))?.Id,
    StreamingCaptureMode = StreamingCaptureMode.Video,
    PhotoCaptureSource = PhotoCaptureSource.VideoPreview
});

这并不能真正解释我所看到的问题,因为我在拍摄照片时将 ImageEncodingProperties 设置为与流相同的分辨率。无论如何,默认的 PhotoCaptureSourceAuto,这一定是使用了 Photo 模式而不是 VideoPreview。一旦我改变了这个,问题就不再出现了。

关于c# - 使用 MediaCapture 时纵横比/缩放级别发生变化的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51072073/

相关文章:

c# - SignalR 可以帮助这种情况 - 无需轮询即可检测计划完成情况吗?

c# - 在所有情况下我都必须取消订阅所有事件吗?

c# - 如何将子窗体显示为 wpf 到 MDI 容器中是正常的 mdi 窗体

c# - UWP 如何绑定(bind)两个值?

uwp - broadFileSystemAccess UWP

c# - DropDownList Bootstrap 样式

c# - 用C#从串口读取所有缓冲区数据

c# - 如果我的 sql 查询返回空白,我应该把我的 C# if 语句放在哪里?

c# - 使用 Ninject 和 wpf 从所有程序集中加载模块

c# - 使用 Linq MVVM 查询 ObservableCollection