前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C# WPF项目实战(经典)

C# WPF项目实战(经典)

作者头像
zls365
发布2020-12-29 12:06:25
2.1K0
发布2020-12-29 12:06:25
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全

目的:输出两台摄像头图像和两路设备图像,每一路设备截图6张

主要知识:

1. 通过SDK调取摄像头图像,并对图像进行剪裁;

2. WPF中定时器DispatcherTimer用法;

3. WPF中跨线程访问控件方法

Dispatcher.Invoke((Action)delegate {});

区别于winform中

this.Invoke((Action)delegate {});

4.xml操作:

代码语言:javascript
复制
 XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\config.xml");
                XmlNode settingNode = xmlDoc.DocumentElement;

                XmlElement e = settingNode.SelectSingleNode("DeviceType") as XmlElement;
                if (e == null)
                {
                    deviceType = "tps2000";
                }
                else
                {
                  deviceType = e.InnerText;
                }

5. 带多个参数的委托

代码语言:javascript
复制
            DP1 = new DataProcess(DeviceIP1, LocalPort1,0);
            DP1.ShowEvent1 = DrawControls1;
            DP1.Start();//启动线程

6.多线程操作

代码语言:javascript
复制
            Thread t1 = new Thread(new ThreadStart(DataRevThread));                  //开启DataRevThread
            t1.Name = "DataRevThread";                                            //线程名字
            t1.Start();
            t1.IsBackground = true;                                                  //后台运行

7. UDP接收,解码;

8. emgucv使用;

9. 工厂模式:

代码语言:javascript
复制

   ModelFactory MF = new ModelFactory();
   DM = MF.CreateDataModelFactory_v1(sNeed.ToString());

10.信号量线程间同步

代码语言:javascript
复制
Semaphore TaskSemaphoreData = new Semaphore(0, 2560);           //数据缓存队列缓存区
 TaskSemaphoreRev.WaitOne();                //等待接收队列

11.Bitmap转换为ImageSource

代码语言:javascript
复制
 [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);

        public static ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
        {
            IntPtr hBitmap = bitmap.GetHbitmap();
            ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

            if (!DeleteObject(hBitmap))
            {
                throw new System.ComponentModel.Win32Exception();
            }
            return wpfBitmap;
        }

12.Queue和list的操作

包括但是不限于以上内容

代码如下:

MainWindow.xaml:

代码语言:javascript
复制
<Fluent:RibbonWindow x:Class="thzSoftware.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Fluent="urn:fluent-ribbon"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"
        xmlns:wfi="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:local="clr-namespace:thzSoftware"
        mc:Ignorable="d"
        Title="MainWindow" Height="600" Width="800" WindowStartupLocation="CenterScreen" WindowState="Maximized" Background="LightBlue" Closing="RibbonWindow_Closing">
    <Grid ShowGridLines="True" >
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="10*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="10*"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <Label Grid.Row="0" Grid.Column="0" Name="labelCamera1Status" Content="摄像头连接状态" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="LightCyan"/>
        <wfi:WindowsFormsHost Grid.Row="1" Grid.Column="0" Background="LightGray">
            <wf:PictureBox x:Name="Cam1" />
        </wfi:WindowsFormsHost>
        <Label Grid.Row="2" Grid.Column="0" Name="labelCamera2Status"  Content="摄像头连接状态" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="LightCyan"/>
        <wfi:WindowsFormsHost Grid.Row="3" Grid.Column="0" Background="LightGray">
            <wf:PictureBox x:Name="Cam2" />
        </wfi:WindowsFormsHost>
        <Label Grid.Row="0" Grid.Column="1" Name="labelThz1Status"  Content="太赫兹连接状态" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="LightCyan"/>
        <Image Grid.Row="1" Grid.Column="1" Name="Thz1"  />
        <Label Grid.Row="2" Grid.Column="1" Name="labelThz2Status"  Content="太赫兹连接状态" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Background="LightCyan"/>
        <Image Grid.Row="3" Grid.Column="1" Name="Thz2" />
       
        <Image Grid.Row="1" Grid.Column="2" Name="Thz1Image1" />
        <Image Grid.Row="1" Grid.Column="3" Name="Thz1Image2" />
        <Image Grid.Row="1" Grid.Column="4" Name="Thz1Image3" />
        <Image Grid.Row="1" Grid.Column="5" Name="Thz1Image4" />
        <Image Grid.Row="1" Grid.Column="6" Name="Thz1Image5" />
        <Image Grid.Row="1" Grid.Column="7" Name="Thz1Image6" />
        <Image Grid.Row="3" Grid.Column="2" Name="Thz2Image1" />
        <Image Grid.Row="3" Grid.Column="3" Name="Thz2Image2" />
        <Image Grid.Row="3" Grid.Column="4" Name="Thz2Image3" />
        <Image Grid.Row="3" Grid.Column="5" Name="Thz2Image4" />
        <Image Grid.Row="3" Grid.Column="6" Name="Thz2Image5" />
        <Image Grid.Row="3" Grid.Column="7" Name="Thz2Image6" />
    </Grid>
</Fluent:RibbonWindow>

MainWindow.xaml.cs

代码语言:javascript
复制
using System;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Windows.Threading;
using MessageBox = System.Windows.MessageBox;
using thzModel;
using System.Drawing;
using System.Windows;
using System.Windows.Media.Imaging;
using System.Windows.Media;
using System.Xml;
using Emgu.CV;
using Emgu.CV.Structure;
using System.Threading;
using System.Drawing.Imaging;
using System.Collections.Generic;
using System.Windows.Controls;
using Image = System.Windows.Controls.Image;

namespace thzSoftware
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Fluent.RibbonWindow
    {
        DispatcherTimer Cam1ReconnectTimer, Cam2ReconnectTimer;
        public MainWindow()
{
            try
            {
                InitializeComponent();
                Environment.CurrentDirectory = AppDomain.CurrentDomain.BaseDirectory;
                
                init();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.StackTrace + ex.Message);

                LogWrite.logWrite(ex.Message, ex.StackTrace);

            }
        }

        public IntPtr PictureDev1Cam { get { return Cam1.Handle; } }
        public IntPtr PictureDev2Cam { get { return Cam2.Handle; } }
        IntPtr Cam1Handle = IntPtr.Zero;
        IntPtr Cam2Handle = IntPtr.Zero;
        Camera Camera1 = new Camera();
        Camera Camera2 = new Camera();
        static private string Cam1IP = "192.168.1.64";
        static private string Cam2IP = "192.168.1.61";
        DataProcess DP1 = null, DP2 = null;
        object ThreadLockBitmap = new object();
        List<ImageSource> thzBitmapList1 = new List<ImageSource>();
        List<ImageSource> thzBitmapList2 = new List<ImageSource>();
        int snapFlag1 = 0, snapFlag2 = 0;
        static public String DeviceType
        {
            get
            {
                return deviceType;
            }
            set
            {
                deviceType = value;
            }
        }
        static private string deviceType = "tps2000";

        void init()
{
            ReadConfigXML();
            Cam1Handle = PictureDev1Cam;
            Cam2Handle = PictureDev2Cam;
            Cam1.SizeMode = PictureBoxSizeMode.Zoom;
            Cam2.SizeMode = PictureBoxSizeMode.Zoom;

            Cam1ReconnectTimer = new DispatcherTimer();
            Cam1ReconnectTimer.Interval = new TimeSpan(0, 0, 3);//定时间隔3秒
            Cam1ReconnectTimer.Tick += Cam1ReconnectTimer_Tick;//加载事件,敲tab键事件框架可以自己出来
            Cam1ReconnectTimer.Start();

            Cam2ReconnectTimer = new DispatcherTimer();
            Cam2ReconnectTimer.Interval = new TimeSpan(0, 0, 3);//定时间隔3秒
            Cam2ReconnectTimer.Tick += Cam2ReconnectTimer_Tick;//加载事件,敲tab键事件框架可以自己出来
            Cam2ReconnectTimer.Start();

            thzModel.Command.CommandUp(8);//发送启动指令

            string DeviceIP1 = "192.168.1.110";
            int LocalPort1 = 8007;
            DP1 = new DataProcess(DeviceIP1, LocalPort1,0);
            DP1.ShowEvent1 = DrawControls1;
            DP1.Start();//启动线程

            string DeviceIP2 = "192.168.1.120";
            int LocalPort2 = 8009;
            DP2 = new DataProcess(DeviceIP2, LocalPort2, 1);
            DP2.ShowEvent2 = DrawControls2;
            DP2.Start();//启动线程

        }
        private void DrawControls1(Bitmap image, bool isWarning, bool isBlack)
{
            Image[] iSource = { Thz1Image1, Thz1Image2, Thz1Image3, Thz1Image4, Thz1Image5, Thz1Image6 };
            Dispatcher.Invoke((Action)delegate
            {
                labelThz1Status.Content = "太赫兹连接成功";
                Thz1.Source = ChangeBitmapToImageSource(image);

                snapFlag1++;
                thzBitmapList1.Add(Thz1.Source);
                if (thzBitmapList1.Count > 6)
                    thzBitmapList1.RemoveAt(0);
                if (snapFlag1 > 8)
                {
                    snapFlag1 = 0;
                    for (int i = 0; i < thzBitmapList1.Count; i++)
                    {
                        iSource[i].Source = thzBitmapList1[i];
                    }
                }

            });
        }
        [System.Runtime.InteropServices.DllImport("gdi32.dll")]
        public static extern bool DeleteObject(IntPtr hObject);

        public static ImageSource ChangeBitmapToImageSource(Bitmap bitmap)
{
            IntPtr hBitmap = bitmap.GetHbitmap();
            ImageSource wpfBitmap = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                hBitmap,
                IntPtr.Zero,
                Int32Rect.Empty,
                BitmapSizeOptions.FromEmptyOptions());

            if (!DeleteObject(hBitmap))
            {
                throw new System.ComponentModel.Win32Exception();
            }
            return wpfBitmap;
        }
        private void DrawControls2(Bitmap image, bool isWarning, bool isBlack)
{
            Image[] iSource = { Thz2Image1, Thz2Image2, Thz2Image3, Thz2Image4, Thz2Image5, Thz2Image6 };
            Dispatcher.Invoke((Action)delegate 
            {
                labelThz2Status.Content = "太赫兹连接成功"; 
                Thz2.Source = ChangeBitmapToImageSource(image);

                snapFlag2++;
                thzBitmapList2.Add(Thz2.Source);
                if (thzBitmapList2.Count > 6)
                    thzBitmapList2.RemoveAt(0);
                if (snapFlag2 > 8)
                {
                    snapFlag2 = 0;
                    for (int i = 0; i < thzBitmapList2.Count; i++)
                    {
                        iSource[i].Source = thzBitmapList2[i];
                    }
                }
            });
        }

        private void ReadConfigXML()
{
            try
            {
                XmlDocument xmlDoc = new XmlDocument();
                xmlDoc.Load(AppDomain.CurrentDomain.BaseDirectory + "\\config.xml");
                XmlNode settingNode = xmlDoc.DocumentElement;

                XmlElement e = settingNode.SelectSingleNode("DeviceType") as XmlElement;
                if (e == null)
                {
                    deviceType = "tps2000";
                }
                else
                {
                  deviceType = e.InnerText;
                }
            }
            catch (Exception ex)
            {
                LogWrite.logWrite(ex.Message, ex.StackTrace);
            }
        }
        private void ConnectCamera(int whitch)
{
            try
            {
                string userName = "admin";
                string password = "a123456.";
                int PortCamera = 8000;
                if (whitch == 1)
                {
                    labelCamera1Status.Content = "摄像头连接中...";
                    Task.Run(() =>
                    {
                        if (!Camera1.ConnectCamera(Cam1IP, PortCamera, userName, password))
                        {
                            Dispatcher.Invoke((Action)delegate { labelCamera1Status.Content = "摄像头连接失败"; });
                        }
                        else
                        {
                            Dispatcher.Invoke((Action)delegate { labelCamera1Status.Content = "摄像头连接成功"; });
                            Camera1.Preview(Cam1Handle);
                            Camera1.AdjustMirrorPara(1);
                            Cam1ReconnectTimer.Stop();
                        }
                    });
                }
                else
                {
                    labelCamera2Status.Content = "摄像头连接中...";
                    Task.Run(() =>
                    {
                        if (!Camera2.ConnectCamera(Cam2IP, PortCamera, userName, password))
                        {
                            Dispatcher.Invoke((Action)delegate { labelCamera2Status.Content = "摄像头连接失败"; });
                        }
                        else
                        {
                            Dispatcher.Invoke((Action)delegate { labelCamera2Status.Content = "摄像头连接成功"; });
                            Camera2.Preview(Cam2Handle);
                            Camera2.AdjustMirrorPara(1);
                            Cam2ReconnectTimer.Stop();
                        }
                    });
                }
            }
            catch (Exception ex)
            {
               MessageBox.Show(ex.StackTrace + ex.Message);
               LogWrite.logWrite(ex.Message, ex.StackTrace);
            }
        }
        private void Cam1ReconnectTimer_Tick(object sender, EventArgs e)
{
            ConnectCamera(1);

        }

        private void RibbonWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
            thzModel.Command.CommandUp(0);//发送停止指令
            //Application.Exit();


        }

        private void Cam2ReconnectTimer_Tick(object sender, EventArgs e)
{
            ConnectCamera(2);
        }

       

    }

}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档