zoukankan      html  css  js  c++  java
  • C# 操作摄像头

    如有雷同,不胜荣幸,若转载,请注明

    这个是大众普通方法,鉴于有网友和朋友问同样的问题,在这里将我的拙劣的代码关键部分贴出来,以便帮助更多的朋友们,不足之处甚多,我可以学习,交流,请教阁下

    废话到此,直接上代码

    private const int WS_CHILD = 0x40000000;  //1073741824
            private const int WS_VISIBLE = 0x10000000;  //268435456
            private const int WM_USER = 0x400;  //1024
            private const int WM_CAP_START = WM_USER;  //1024
            private const int WM_CAP_STOP = WM_CAP_START + 68;  //1092
            private const int WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;  //1034
            private const int WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;  //1035
            private const int WM_CAP_SAVEDIB = WM_CAP_START + 25;  //1049
            private const int WM_CAP_GRAB_FRAME = WM_CAP_START + 60;  //1084
            private const int WM_CAP_SEQUENCE = WM_CAP_START + 62;  //1086
            private const int WM_CAP_FILE_SET_CAPTRUE_FILEA = WM_CAP_START + 20;  //1044
            private const int WM_CAP_SEQUENCE_NOFILE = WM_CAP_START + 63;  //1087
            private const int WM_CAP_CAPTURE_IMAGE_CLIPBOARD = WM_CAP_START + 30;  //1054 复制捕捉的图像到剪切板
            private const int WM_CAP_SET_OVERLAY = WM_CAP_START + 51;  //1075
            private const int WM_CAP_SET_PREVIEW = WM_CAP_START + 50;  //1074
            private const int WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START + 6;  //1030
            private const int WM_CAP_SET_CALLBACK_ERROR = WM_CAP_START + 2;  //1026
            private const int WM_CAP_SET_CALLBACK_STATUSA = WM_CAP_START + 3;  //1027
            private const int WM_CAP_SET_CALLBACK_FRAME = WM_CAP_START + 5;  //1029
            private const int WM_CAP_SET_SCALE = WM_CAP_START + 53;  //1077
            private const int WM_CAP_SET_PREVIEWRATE = WM_CAP_START + 52;  //1076
            private const int WM_CAP_DLG_VIDEOSOURCE = WM_CAP_START + 42;  //1066 选择摄像头

    /// <summary>
            /// 开启视频摄像头
            /// </summary>
            /// <returns></returns>
            public static void Start()
            {
                if (bWorkStart)
                {
                    return;
                }
                byte[] lpszName = new byte[100];
                try
                {
                    hWndC = Windows.capCreateCaptureWindow(lpszName, WS_CHILD | WS_VISIBLE, mLeft, mTop, mWidth, mHeight, mControlPtr, 0);
                    if (hWndC.ToInt32() != 0)
                    {
                        Windows.SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);  //设置返回视频流
                        Windows.SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);  //设置返回错误
                        Windows.SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);  //设置返回状态
                        //=====================这条比较慢=======================
                        Windows.SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);  //设备连接
                        //=====================================================
                        //Windows.SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);  //开始捕捉
                        //=====================================================
                        Windows.SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);  //设置比例
                        Windows.SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 66, 0);  //设置预览速度
                        Windows.SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);  //设置叠加
                        Windows.SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);  //设置预览


                        bWorkStart = true;
                    }
                    //return true;
                }
                catch (Exception)
                {
                    //return false;
                }
                //finally
                //{
                    //写日志  Global.log.Write( “SendMessage “);
                    //LogClass.WriteLog("SendMessage");
                //}
            }

    /// <summary>
            /// 关闭视频摄像头
            /// </summary>
            public static void Stop()
            {
                Windows.SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
                bWorkStart = false;
            }

    /// <summary>
            /// 抓图或者拍照,然后保存到指定路径下
            /// </summary>
            /// <param name="path">要保存bmp文件的路径</param>
            public static void GrabImage(string path)
            {
                IntPtr hBmp = Marshal.StringToHGlobalAnsi(path);
                Windows.SendMessage(hWndC, WM_CAP_SAVEDIB, 0, hBmp.ToInt32());  //0x41e
            }

    /// <summary>
            /// 捕捉图像复制到剪切板
            /// </summary>
            /// <returns></returns>
            public static bool CopyToClipBoard()
            {
                return Windows.SendMessage(hWndC, WM_CAP_CAPTURE_IMAGE_CLIPBOARD, 0, 0); 
            }

  • 相关阅读:
    atitit.TokenService v3 qb1 token服务模块的设计 新特性.docx
    Atitit attilax在自然语言处理领域的成果
    Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
    Atitit (Sketch Filter)素描滤镜的实现  图像处理  attilax总结
    atitit。企业的价值观 员工第一 vs 客户第一.docx
    Atitit 实现java的linq 以及与stream api的比较
    Atitit dsl exer v3 qb3 新特性
    Atititi tesseract使用总结
    Atitit 修改密码的功能流程设计 attilax总结
    atitit.TokenService v3 qb1  token服务模块的设计 新特性.docx
  • 原文地址:https://www.cnblogs.com/ching2009/p/4293594.html
Copyright © 2011-2022 走看看