WPF攝像頭使用(WPFMediaKit)


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

    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM