C#在WinForm下用摄像头实现抓图和录制(转至网络)

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using webcam;

using PickHead;

namespace test_avicap

{

    public partial class Form1 : Form

    {

       // WebCamera wc;

        Pick pick;

        public Form1()

        {

            InitializeComponent();

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            //b_play.Enabled = false;

            //b_stop.Enabled = true;

            //panelPreview.Size = new Size(330, 330);

            //wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);

            //wc.StartWebCam();

            int left=0;

            int top=0;

            int width=352;

            int height=288;

            pick = new Pick( panelPreview.Handle, left,top,  width, height );

            pick.Start();

        }

        private void b_play_Click(object sender, EventArgs e)

        {

            //b_play.Enabled = false;

            //b_stop.Enabled = true;

            //panelPreview.Size = new Size(330, 330);

            //wc = new WebCamera(panelPreview.Handle, panelPreview.Width, panelPreview.Height);

            //wc.StartWebCam(); 

            int left = 0;

            int top = 0;

            int width =352;

            int height = 288; 

            pick = new Pick(panelPreview.Handle, left, top, width, height);

            pick.Start();

        }

        private void b_stop_Click(object sender, EventArgs e)

        {

            

            //wc.CloseWebcam();

            pick.Stop();

        }

     

        protected override void OnClosing(CancelEventArgs e)

        {

            if (MessageBox.Show("退出本系统?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)

                Application.Exit();

            else

                e.Cancel = true;

        }

        private void b_pic_Click(object sender, EventArgs e)//拍摄

        {

            if (this.b_pic.Text == "拍摄&A") //用于摄像的

            {

                b_pic.Text = "重照&C";

                string path;

                sdf1.Filter = "图片*.bmp;*.jpg;.jpeg;*.gif|*.bmp|所有文件(*.*)|*.*";

                if (sdf1.ShowDialog() == DialogResult.OK)

                {

                    path = sdf1.FileName;

                    pick.GrabImage(path);

                    pic_show.ImageLocation = path;  //并显示在方框中

                    pic_show.Location = new Point(110, 12);

                    pic_show.Visible = true;

                    panelPreview.Visible = false;

                    pick.Stop();

                }

            }

            else

            {

                b_pic.Text = "拍摄&A";

                pic_show.Visible = false;

                panelPreview.Location = new Point(110, 12);

                panelPreview.Visible = true;

                pick.Start();

            }

        }

    }

}

 

调用的类(class1.cs)

 //本文是借助avicap32.dll库来驱动摄像头。做到了抓图、录像功能。

using System;

using System.Runtime.InteropServices;

using System.Drawing;

using System.Drawing.Imaging;

namespace PickHead

{

    ///

    /// 一个控制摄像头的类

    ///

    public class Pick

    {

        private const int WM_USER = 0x400;

        private const int WS_CHILD = 0x40000000;

        private const int WS_VISIBLE = 0x10000000;

        private const int WM_CAP_START = WM_USER;

        private const int WM_CAP_STOP = WM_CAP_START + 68;

        private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;

        private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;

        private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;

        private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;

        private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;

        private const int WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;

        private const int WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63;

        private const int WM_CAP_SET_OVERLAY =WM_CAP_START+ 51;

        private const int WM_CAP_SET_PREVIEW =WM_CAP_START+ 50;

        private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;

        private const int WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;

        private const int WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;

        private const int WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;

        private const int WM_CAP_SET_SCALE=WM_CAP_START+ 53;

        private const int WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52;

        private IntPtr hWndC;

        private bool bStat = false;

        private IntPtr mControlPtr;

        private int mWidth;

        private int mHeight;

        private int mLeft;

        private int mTop;

        ///

        /// 初始化摄像头

        ///

        /// 控件的句柄

        /// 开始显示的左边距

        /// 开始显示的上边距

        /// 要显示的宽度

        /// 要显示的长度

        public Pick(IntPtr handle, int left, int top, int width,int height)

        {

            mControlPtr = handle;

            mWidth = width;

            mHeight = height;

            mLeft = left;

            mTop = top;

        }

        [DllImport("avicap32.dll")]

        private static extern IntPtr capCreateCaptureWindowA(byte[] lpszWindowName, int dwStyle, int x, int y, int nWidth, int nHeight, IntPtr hWndParent, int nID);

        [DllImport("avicap32.dll")]

        private static extern int capGetVideoFormat(IntPtr hWnd, IntPtr psVideoFormat, int wSize );

        [DllImport("User32.dll")]

        private static extern bool SendMessage(IntPtr hWnd, int wMsg, int wParam, int lParam);

        ///

        /// 开始显示图像

        ///

        public void Start()

        {

            if (bStat)

            return;

            bStat = true;

            byte[] lpszName = new byte[100];

            hWndC = capCreateCaptureWindowA(lpszName,WS_CHILD|WS_VISIBLE ,mLeft,mTop,mWidth,mHeight,mControlPtr,0);

            if (hWndC.ToInt32() != 0)

            {

                SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);

                SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);

                SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);

                SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);

                SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);

                SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);

                SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);

                SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);

            }

            return;

        }

        ///

        /// 停止显示

        ///

        public void Stop()

        {

            SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);

            bStat = false;

        } 

        ///

        /// 抓图

        ///

        /// 要保存bmp文件的路径

        public void GrabImage(string path)

       // public void GrabImage( )

        {

            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);

            SendMessage(hWndC,WM_CAP_SAVEDIB,0,hBmp.ToInt32());

        }

        ///

        /// 录像

        ///

        /// 要保存avi文件的路径

        public void Kinescope(string path)

        {

            IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);

            SendMessage(hWndC,WM_CAP_FILE_SET_CAPTURE_FILEA,0,hBmp.ToInt32());

            SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);

        }

        ///

        /// 停止录像

        ///

        public void StopKinescope()

        {

            SendMessage(hWndC, WM_CAP_STOP, 0, 0);

        }

     }

转载于:https://www.cnblogs.com/hejp/archive/2012/09/20/2695659.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值