MediaCapture Windows 8 桌面应用程序 - 无法运行

MediaCapture Windows 8 Desktop Application- Can't get it work

我正在尝试通过此 API 实现图像捕获,我需要通过桌面应用程序实现。

问题是,当我将图像保存到文件中时(CapturePhotoToStorageFileAsync),我得到的图片很暗(几乎是黑色),或者我得到的文件大小为零。

虽然我的代码很简单:

MediaCapture = new MediaCapture();
await mediaCapture.InitializeAsync();

Windows.Storage.StorageFile photoStorageFile;
String PHOTO_FILE_NAME = "photo.jpg";
photoStorageFile = await Windows.Storage.KnownFolders.PicturesLibrary.CreateFileAsync(PHOTO_FILE_NAME, Windows.Storage.CreationCollisionOption.GenerateUniqueName);
ImageEncodingProperties imageProperties = ImageEncodingProperties.CreateJpeg();
await mediaCapture.CapturePhotoToStorageFileAsync(imageProperties, photoStorageFile);

我读了另一个关于它的帖子: Captured photos are black when using MediaCapture on Windows Phone 8.1

问题是 MediaCapture.StartPreviewAsync 引发了异常 "An unexpected error has occured in the operation requested",我想这是因为我没有 MediaElement(同样是桌面)。

我也很高兴找到一个工作示例,当我搜索时,我没有找到任何在桌面应用程序上实现 MediaCapture 的真实示例,我看到一篇文章但没有附加代码: http://blogs.msdn.com/b/eternalcoding/archive/2013/10/29/how-to-use-specific-winrt-api-from-desktop-apps-capturing-a-photo-using-your-webcam-into-a-wpf-app.aspx

我还发现其他人也问了一个样本,但没有真正的答案...

我怎样才能得到一个工作样本?

为了让您的商店应用与相机交互,实际上有两种方法,一种是简单的,一种是高级的:

  • 要么使用提供的用户界面,这是一种常见的 UI 用于捕获媒体,它可以让您免去处理基本捕获操作的痛苦,
  • 或者通过与 MediaCapture 交互 API 自己获得对整个操作流程的完全控制。

如果你只是想从 网络摄像头,我建议你使用第一种方法,主要使用 CameraCaptureUI API,但是如果你需要完全控制捕获操作,你需要一些与 MediaCapture 交互的代码行API秒

这里是一个使用 CameraCapture 的简单示例UI API :

假设我们有以下 UI:

 <StackPanel Orientation="Vertical">
        <Button Click="TakePicture_Click" Content="Capture Photo" HorizontalAlignment="Stretch"/>
        <Border BorderBrush="White" BorderThickness="3">
            <Image x:Name="Picture" Height="700" VerticalAlignment="Center" HorizontalAlignment="Center" />
        </Border>            
    </StackPanel>

这里是捕捉按钮点击处理程序:

private async void TakePicture_Click(object sender, RoutedEventArgs e)
    {
        var camera = new CameraCaptureUI();
        var image = await camera.CaptureFileAsync(CameraCaptureUIMode.Photo);
        if (image != null)
        {
            var stream = await image.OpenAsync(FileAccessMode.Read);
            var bitmap = new BitmapImage();
            bitmap.SetSource(stream);
            Picture.Source = bitmap;
        }
        else
        {
            (new MessageDialog("Something went wrong")).ShowAsync();                
        }
    }

您还需要通过检查应用清单中的网络摄像头功能来为您的应用提供使用网络摄像头的权限

MediaCapture 在桌面应用程序中预览相机视频并非易事。我不确定所有的部分都在那里,所以我在 GitHub 上整理了一些代码来尝试一下,它似乎工作正常。

https://github.com/mmaitre314/MediaCaptureWPF

一个警告:构建 MediaCapture/WPF 互操作需要一些本机代码 (C++/CLI),因此应用程序需要构建为 x86 或 x64,但不是 AnyCPU。