添加WPFMediaKit引用

使用WPFMediaKit操作摄像头需要安装WPFMediaKit相关的Nuget包。选中需要进行摄像头操作的项目,然后通过Nuget安装即可。

页面代码

引入命名空间
在页面XAML代码中添加WPFMediaKit的命名空间:
xmlns:WPFMediaKit="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit"

添加摄像头

<WPFMediaKit:VideoCaptureElement Name="vce" Stretch="Fill" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="3" />

详细代码
如下:
CameraWindow.xaml

<Window x:Class="WPF_WPFMediaKit.CameraWindow" x:Name="cameraWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:WPFMediaKit="clr-namespace:WPFMediaKit.DirectShow.Controls;assembly=WPFMediaKit"
Title="相机" Height="500" Width="765" ResizeMode="NoResize" WindowStartupLocation="CenterScreen" Loaded="Window_Loaded">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="50"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="150"/>
</Grid.ColumnDefinitions> <WPFMediaKit:VideoCaptureElement Name="vce" Stretch="Fill" Grid.Column="0" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="3" />
<Button x:Name="btnExChange" Grid.Column="0" Grid.Row="0" Content="切换" Click="btnExChange_Click"></Button>
<Grid Grid.Column="2" Grid.Row="0" Grid.RowSpan="2">
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Grid.Row="0" x:Name="btnConfirm" Content="确认" Click="btnConfirm_Click" Visibility="Hidden"></Button>
<Button Grid.Row="1" x:Name="btnCapture" Content="拍照" Click="btnCapture_Click"></Button>
<Button Grid.Row="2" x:Name="btnReStart" Content="重拍" Click="btnReStart_Click" Visibility="Hidden"></Button>
</Grid>
</Grid>
</Window>

页面交互

设置启动摄像头

vce.VideoCaptureSource = MultimediaUtil.VideoInputNames[cameraIndex];

完成拍照并保存为图片

RenderTargetBitmap bmp = new RenderTargetBitmap((int)vce.ActualWidth, (int)vce.ActualHeight, 96, 96, PixelFormats.Default);

                vce.Measure(vce.RenderSize);
vce.Arrange(new Rect(vce.RenderSize));
bmp.Render(vce);
BitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp));

重启摄像头

vce.Play();

详细代码
如下:
CameraWindow.xaml.cs

using System;
using System.IO;
using System.Windows;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using WPFMediaKit.DirectShow.Controls; namespace WPF_WPFMediaKit
{
/// <summary>
/// CameraWindow.xaml 的交互逻辑
/// </summary>
public partial class CameraWindow : Window
{
private int cameraIndex = 0; //记录当前选择的摄像头的索引值
private string imgTempPath = ""; /// <summary>
/// 测试用
/// </summary>
public CameraWindow()
{
InitializeComponent();
} private void Window_Loaded(object sender, RoutedEventArgs e)
{
if (MultimediaUtil.VideoInputNames.Length > 0)
{
cameraIndex = 0;
vce.VideoCaptureSource = MultimediaUtil.VideoInputNames[cameraIndex]; if (MultimediaUtil.VideoInputNames.Length > 1)
{
btnExChange.Visibility = Visibility.Visible;
}
else
{
btnExChange.Visibility = Visibility.Hidden;
}
}
else
{
MessageBox.Show("当前设备没有安装任何可用摄像头");
this.Close();
}
} private void btnCapture_Click(object sender, RoutedEventArgs e)
{
try
{
RenderTargetBitmap bmp = new RenderTargetBitmap((int)vce.ActualWidth, (int)vce.ActualHeight, 96, 96, PixelFormats.Default); vce.Measure(vce.RenderSize);
vce.Arrange(new Rect(vce.RenderSize));
bmp.Render(vce);
BitmapEncoder encoder = new JpegBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(bmp)); //创建图片存储路径,每个工程一个文件夹
string directory = AppDomain.CurrentDomain.BaseDirectory + "Images" ;
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
} //可能会多次拍摄,在图片后加上时间戳
string imgName = "img" + DateTime.Now.ToString("yyyyMMddHHmmssffff");
imgTempPath = AppDomain.CurrentDomain.BaseDirectory + "Images\\" + imgName + ".bmp";
FileStream fstream = new FileStream(imgTempPath, FileMode.Create);
encoder.Save(fstream);
fstream.Close();
vce.Pause();
btnConfirm.Visibility = Visibility.Visible;
btnReStart.Visibility = Visibility.Visible;
}
catch (Exception ex)
{
if (vce.ActualWidth == 0 || vce.ActualHeight == 0)
{
MessageBox.Show("请勿重复按钮");
return;
}
else
{
MessageBox.Show(ex.Message);
return;
}
}
} private void btnReStart_Click(object sender, RoutedEventArgs e)
{
try
{
vce.Play();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
} } //切换摄像头
private void btnExChange_Click(object sender, RoutedEventArgs e)
{
if (MultimediaUtil.VideoInputNames.Length > 1)
{
if (vce.VideoCaptureSource == MultimediaUtil.VideoInputNames[0])
{
vce.VideoCaptureSource = MultimediaUtil.VideoInputNames[1];
}
else
{
vce.VideoCaptureSource = MultimediaUtil.VideoInputNames[0];
}
}
else
{
MessageBox.Show("当前设备没有可切换的摄像头!");
}
} private void btnConfirm_Click(object sender, RoutedEventArgs e)
{
try
{
if (imgTempPath != "" && File.Exists(imgTempPath))
{
this.Close();
}
else
{
MessageBox.Show("图片丢失,请重新拍摄。");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
} }
}
 
 

WPF摄像头使用(WPFMediaKit)的更多相关文章

  1. WPF中使用WPFMediaKit视频截图案例

    前台 代码: <Window x:Class="WpfAppWPFMediaKit.MainWindow" xmlns="http://schemas.micros ...

  2. AR播放器

    一.项目需求 AR播放器:将一系列带透明通道的图片以一定的帧率连续显示,叠加载摄像头采集的画面之上,并播放声音. 此为最初级的AR技术,因为画面是事先渲染好的,固定不变的,所以实际上并不能实现“互动” ...

  3. 近期建了一个.net源代码共享群,群共享有大量网友分享的.net(C#)商业源代码

    本群创建于2013/6/21: 群里都是.net(C#)程序开发者,群共享有大量网友分享的.net(C#)商业源代码.比方:DTCMS旗舰版,hishop微分销,shopnum微分销.多用户微信公众平 ...

  4. 最近建了一个.net源码共享群,群共享有大量网友分享的.net(C#)商业源码

    .net源码共享群 324087998. 本群创建于2013/6/21: 群里都是.net(C#)程序开发人员,群共享有大量网友分享的.net(C#)商业源码.比如:DTCMS旗舰版,hishop微分 ...

  5. wpf mediakit 摄像头截图

    原文:wpf mediakit 摄像头截图 在用VideoCaptureElement的过程中,不知道怎么获得摄像头的截图,纠结了整整一天, 最终在下面的网站上找到了答案,哈哈.(困的都不清醒的大脑, ...

  6. WPF另类实现摄像头录像

    WPF中使用第三方控件来直接进行录像的控件没有找到(aforgenet好像不维护了?WPFMediaKit好像只能实现摄像头拍照.收费的控件没有使用,不做评论.) 通过百度(感谢:https://ww ...

  7. 在WPF程序中使用摄像头兼谈如何使用AForge.NET控件(转)

    前言: AForge.NET 是用C#写的一个关于计算机视觉和人工智能领域的框架,它包括图像处理.神经网络.遗传算法和机器学习等.在C#程序中使用摄像头,我习惯性使用AForge.NET提供的类库.本 ...

  8. 【MediaKit】WPF项目中 调用摄像头拍照的开发包

    今天遇到一个 人事的项目,项目中需要调用摄像头给员工照相.如何解决这个问题呢? 介绍一个开发包给你,MediaKit.论坛里头的人都说好,但是黑兔觉得大家好才是真的好.你不妨试试~ 第一步:添加WPF ...

  9. WPF实现摄像头镜像翻转

    之前的项目需要镜像翻转摄像头视频,使用Aforge.Net来处理视频. 一开始考虑直接从Aforge.Net读取没一帧视频图片,然后复制给WPF的Image控件,这种方法基本很卡,所以放弃了. 考虑到 ...

  10. 在WPF中使用AForge.net控制摄像头拍照

    原文:在WPF中使用AForge.net控制摄像头拍照 利用AForge.net控制摄像头拍照最方便的方法就是利用PictureBox显示摄像头画面,但在WPF中不能直接使用PictureBox.必须 ...

随机推荐

  1. HarmonyOS应用兼容稳定性云测试

      兼容性测试 兼容性测试主要验证HarmonyOS应用在华为真机设备上运行的兼容性问题,包括首次安装.再次安装.启动.卸载.崩溃.黑白屏.闪退.运行错误.无法回退.无响应.设计约束场景.具体兼容性测 ...

  2. HDC2021技术分论坛:HarmonyOS本地模拟器重磅来袭!

    作者:longjiangyun,模拟器开发工程师 HarmonyOS模拟器是应用开发者使用IDE进行代码开发.调试.测试等活动中必不可少的工具,它分为本地模拟器和远程模拟器,其中远程模拟器又分为单设备 ...

  3. 文件上传之Webshell连接方法

    "感谢您阅读本篇博客!如果您觉得本文对您有所帮助或启发,请不吝点赞和分享给更多的朋友.您的支持是我持续创作的动力,也欢迎留言交流,让我们一起探讨技术,共同成长!谢谢!" Websh ...

  4. 详解 Flink 容器化环境下的 OOM Killed

    简介: 本文将解析 JVM 和 Flink 的内存模型,并总结在工作中遇到和在社区交流中了解到的造成 Flink 内存使用超出容器限制的常见原因.由于 Flink 内存使用与用户代码.部署环境.各种依 ...

  5. 钉钉宜搭亮相“第二届ISIG中国产业智能大会”:云钉低代码,构建企业酷应用

    ​简介:低代码年度行业盛会!钉钉宜搭创始人叶周全受邀出席并发表主题演讲. 12月8日,由中国电子技术标准化研究院指导,RPA中国.LowCode低码时代.信创中国联合举办的"第二届ISIG中 ...

  6. 2021云栖大会开源引力峰会重磅发布的战略合作,Grafana服务到底是什么?

    简介: 这几天关注云栖大会的小伙伴一定会发现阿里巴巴合伙人.阿里云高级研究员蒋江伟(小邪)在云栖大会开源引力峰会的演讲中,特别提到了一个叫 Grafana 服务的产品,并特意花费一页 PPT 介绍了这 ...

  7. ICBU可控文本生成技术详解

    ​简介: 文本生成(Text Generation)是自然语言处理(Natural Language Processing,NLP)领域的一项重要且具有挑战的任务.顾名思义,文本生成任务的目的是生成近 ...

  8. [FAQ] docker-compose MySQL8 ERROR: Different lower_case_table_names settings for server

    MySQL8 启动时 lower_case_table_names 的设置和初始值不一致时,会报 ERROR. 在 docker-compose 中,只需要在命令中加入命令选项即可,并配置一个新的 v ...

  9. WPF 通过 RawInput 获取触摸消息

    触摸在 Windows 下属于比较特殊的输入,不同于键盘和鼠标,键盘和鼠标可以通过全局 Hook 的方式获取到鼠标和键盘的输入消息.而触摸则没有直接的 Hook 的方法.如果期望自己的应用,可以在没有 ...

  10. 7.deployment扩容-查看pod使用的CPU-统计ready状态节点数量

    官方文档:https://kubernetes.io/zh-cn/docs/tasks/run-application/scale-stateful-set/题目1: 将名为loadbalancer的 ...