WPF或Windows Forms中的MediaCapture API

3
我想在Windows Forms或WPF应用程序中使用MediaCapture,但显然它仅在UWP应用程序中可用。我们如何在WPF或Windows Forms应用程序中使用它?有很多关于这个问题的问题,但没有一个清晰地解决了这个问题。
1个回答

3

是的,您可以在WinForms或WPF应用程序中使用MediaCapture API。为此,您需要设置项目以针对正确的Windows版本:

  • 对于.NET 6,您可以在属性中设置目标操作系统为10.0.17763.0或更高版本(或在项目文件中将TargetFramework设置为net6.0-windows10.0.17763.0)
  • 对于.NET 4.8,您可以启用包管理器的PackageReference,并安装Microsoft.Windows.SDK.Contracts软件包(10.0.17763.0或更高版本)。

我已经分享了.NET 6和.NET Framework 4.8的项目设置和代码示例。要了解更多信息,您可以查看在桌面应用程序中调用Windows Runtime API

下载或克隆示例

使用 MediaCapture 抓取图像 - WinForms .NET 6

  1. 创建一个 WinForms 应用程序(.NET 6)

  2. 编辑项目属性,将目标操作系统设置为 10.0.17763.0 或更高版本。您也可以像这样修改项目文件:

    <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>WinExe</OutputType>
        <TargetFramework>net6.0-windows10.0.17763.0</TargetFramework>
        <Nullable>enable</Nullable>
        <UseWindowsForms>true</UseWindowsForms>
        <ImplicitUsings>enable</ImplicitUsings>
      </PropertyGroup>
    
    </Project>
    
  3. 在窗体上放置一个按钮(button1)和一个图片框(pictureBox1)。

  4. 处理按钮单击事件,并添加以下代码以使用相机捕获您的照片并将其转换为位图并显示在图片框中:

    private async void button1_Click(object sender, EventArgs e)
    {
        var mediaCapture = new MediaCapture();
        await mediaCapture.InitializeAsync();
        mediaCapture.Failed += (obj, args) => MessageBox.Show(args.Message);
    
        var lowLagCapture = await mediaCapture.PrepareLowLagPhotoCaptureAsync(
            ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8));
        var capturedPhoto = await lowLagCapture.CaptureAsync();
        var softwareBitmap = capturedPhoto.Frame.SoftwareBitmap;
        await lowLagCapture.FinishAsync();
        using (var stream = new InMemoryRandomAccessStream())
        {
            var encoder = await BitmapEncoder.CreateAsync(
                BitmapEncoder.PngEncoderId, stream);
            encoder.SetSoftwareBitmap(softwareBitmap);
            await encoder.FlushAsync();
            pictureBox1.Image = new Bitmap(stream.AsStream());
        }
    }
    

    使用以下 using 语句:

    using Windows.Graphics.Imaging;
    using Windows.Media.Capture;
    using Windows.Media.MediaProperties;
    using Windows.Storage.Streams;
    using System.IO;
    
  5. 将 PictureBox.SizeMode 设置为 Zoom。

  6. 运行应用程序,单击按钮并在 PictureBox 中查看图片。

使用MediaCapture捕获图像 - WinForms .NET 4.8

示例代码与我在.NET 6示例中分享的相同,唯一的区别在于准备项目和添加引用。(我还分享了另一个答案的步骤。)

  1. 转到工具 → 设置“默认软件包管理格式”为“PackageReference”
  2. 解决方案资源管理器 → 右键单击您的项目 → 选择“管理NuGet软件包”,并
  3. 找到 Microsoft.Windows.SDK.Contracts 软件包。在NuGet软件包管理器窗口的右侧窗格中,根据您想要定位的Windows 10版本选择所需版本的软件包,然后单击安装。
  4. 按照前面示例中的第3步。

更多信息和示例:


谢谢@Reza-aghaei的回复。我们也可以在旧版本的Windows 10上使用吗? - Riz
查看此文档软件包版本,我所看到的.NET 4.x的最低版本是:'10.0.17134.xxxx:选择此版本适用于Windows 10,版本1803。'而对于.NET 6:'net6.0-windows10.0.17763.0:如果您的应用程序针对Windows 10,版本1809,请选择此版本。' - Reza Aghaei
下载源代码或克隆存储库,并在目标 Windows 上尝试运行。示例已准备就绪,包含 .NET6 和 .NET 4.8 项目。 - Reza Aghaei
1
我同意。它被关闭并建议添加更多细节,所以我不得不这样做。我会发布更详细的单独问题。谢谢你的时间。 - Riz
1
@demonplus 我已经在这个分支中添加了一个 WPF 项目示例 https://github.com/dotriz/MediaCaptureApiExample - Riz
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接