添加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);
}
}
}
}
