示例#1
0
 public unsafe static extern IntPtr CreateDIBSection(IntPtr hdc, ref Win32.BITMAPINFO pbmi, uint iUsage, ref void *ppvBits, IntPtr hSection, uint dwOffset);
示例#2
0
        /// <summary>
        ///  打开视频设备
        /// </summary>
        /// <param name="width">捕获窗口的宽度</param>
        /// <param name="height">捕获窗口的高度</param>
        /// <returns></returns>
        public bool StartWebCam(int width, int height)
        {
            //byte[] lpszName = new byte[100];
            //byte[] lpszVer = new byte[100];
            //Win32.capGetDriverDescriptionA(0, lpszName, 100, lpszVer, 100);
            //this.lwndC = Win32.capCreateCaptureWindowA(lpszName, Win32.WS_CHILD | Win32.WS_VISIBLE, 0, 0, mWidth, mHeight, mControlPtr, 0);
            //if (Win32.SendMessage(lwndC, Win32.WM_CAP_DRIVER_CONNECT, 0, 0))
            //{
            //    Win32.SendMessage(lwndC, Win32.WM_CAP_SET_PREVIEWRATE, 100, 0);
            //    Win32.SendMessage(lwndC, Win32.WM_CAP_SET_PREVIEW, true, 0);
            //    return true;
            //}
            //else
            //{
            //    return false;
            //}
            this.lwndC = Win32.capCreateCaptureWindow("My Own Capture Control", Win32.WS_CHILD | Win32.WS_VISIBLE, 0, 0, mWidth, mHeight, mControlPtr, 0); //AVICap类的捕捉窗口
            Win32.FrameEventHandler FrameEventHandler = new Win32.FrameEventHandler(FrameCallback);
            Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_CALLBACK_ERROR, 0, 0);                                                                          //注册错误回调函数
            Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_CALLBACK_STATUS, 0, 0);                                                                         //注册状态回调函数
            Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0, 0);                                                                    //注册视频流回调函数
            Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_CALLBACK_FRAME, 0, FrameEventHandler);                                                          //注册帧回调函数

            //if (!CapDriverCAPS.fCaptureInitialized)//判断当前设备是否被其他设备连接已经连接
            //{

            if (Win32.SendMessage(this.lwndC, Win32.WM_CAP_DRIVER_CONNECT, 0, 0))
            {
                //-----------------------------------------------------------------------
                Win32.SendMessage(this.lwndC, Win32.WM_CAP_DRIVER_GET_CAPS, Win32.SizeOf(CapDriverCAPS), ref CapDriverCAPS); //获得当前视频 CAPDRIVERCAPS定义了捕获驱动器的能力,如有无视频叠加能力、有无控制视频源、视频格式的对话框等;
                Win32.SendMessage(this.lwndC, Win32.WM_CAP_GET_STATUS, Win32.SizeOf(CapStatus), ref CapStatus);              //获得当前视频流的尺寸 存入CapStatus结构

                Win32.BITMAPINFO bitmapInfo = new Win32.BITMAPINFO();                                                        //设置视频格式 (height and width in pixels, bits per frame).
                bitmapInfo.bmiHeader            = new Win32.BITMAPINFOHEADER();
                bitmapInfo.bmiHeader.biSize     = Win32.SizeOf(bitmapInfo.bmiHeader);
                bitmapInfo.bmiHeader.biWidth    = mWidth;
                bitmapInfo.bmiHeader.biHeight   = mHeight;
                bitmapInfo.bmiHeader.biPlanes   = 1;
                bitmapInfo.bmiHeader.biBitCount = 24;
                Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_PREVIEWRATE, 40, 0); //设置在PREVIEW模式下设定视频窗口的刷新率 设置每40毫秒显示一帧,即显示帧速为每秒25帧
                Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_SCALE, 1, 0);        //打开预览视频的缩放比例
                Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_VIDEOFORMAT, Win32.SizeOf(bitmapInfo), ref bitmapInfo);

                this.mFrameEventHandler = new Win32.FrameEventHandler(FrameCallback);
                this.capSetCallbackOnFrame(this.lwndC, this.mFrameEventHandler);


                Win32.CAPTUREPARMS captureparms = new Win32.CAPTUREPARMS();
                Win32.SendMessage(this.lwndC, Win32.WM_CAP_GET_SEQUENCE_SETUP, Win32.SizeOf(captureparms), ref captureparms);
                if (CapDriverCAPS.fHasOverlay)
                {
                    Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_OVERLAY, 1, 0);                             //启用叠加 注:据说启用此项可以加快渲染速度
                }
                Win32.SendMessage(this.lwndC, Win32.WM_CAP_SET_PREVIEW, 1, 0);                                 //设置显示图像启动预览模式 PREVIEW
                Win32.SetWindowPos(this.lwndC, 0, 0, 0, width, height, Win32.SWP_NOZORDER | Win32.SWP_NOMOVE); //使捕获窗口与进来的视频流尺寸保持一致
                return(true);
            }
            else
            {
                flag = false;
                return(false);
            }
        }
示例#3
0
        public unsafe bool Create(IntPtr hWnd, int width, int height)
        {
            int num1 = width & -16;

            if (num1 < width)
            {
                num1 += 16;
            }
            int num2 = height & -16;

            if (num2 < height)
            {
                num2 += 16;
            }
            if (this.Handle != (IntPtr)null && num1 == this._width && num2 == this._height)
            {
                return(false);
            }
            this._width  = num1;
            this._height = num2;
            Win32.BITMAPINFO pbmi = new Win32.BITMAPINFO();
            pbmi.bmiHeader.biSize          = (uint)sizeof(Win32.BITMAPINFOHEADER);
            pbmi.bmiHeader.biWidth         = num1;
            pbmi.bmiHeader.biHeight        = -num2;
            pbmi.bmiHeader.biPlanes        = (ushort)1;
            pbmi.bmiHeader.biBitCount      = (ushort)32;
            pbmi.bmiHeader.biCompression   = 0U;
            pbmi.bmiHeader.biSizeImage     = 0U;
            pbmi.bmiHeader.biXPelsPerMeter = 0;
            pbmi.bmiHeader.biYPelsPerMeter = 0;
            pbmi.bmiHeader.biClrUsed       = 0U;
            pbmi.bmiHeader.biClrImportant  = 0U;
            if (this._hDC != (IntPtr)null)
            {
                Win32.DeleteDC(this._hDC);
                this._hDC = (IntPtr)null;
            }
            if (this._hBitmap != (IntPtr)null)
            {
                Win32.DeleteObject(this._hBitmap);
                this._hBitmap = (IntPtr)null;
            }
            this._hBitmap = Win32.CreateDIBSection((IntPtr)null, ref pbmi, 0U, ref this.bits, (IntPtr)null, 0U);
            if (this._hBitmap == (IntPtr)null)
            {
                return(false);
            }
            IntPtr dc = Win32.GetDC(hWnd);

            this._hDC = Win32.CreateCompatibleDC(dc);
            Win32.ReleaseDC(hWnd, dc);
            if (!(this._hDC == (IntPtr)null) && !(Win32.SelectObject(this._hDC, this._hBitmap) == (IntPtr)null))
            {
                return(true);
            }
            if (this._hDC != (IntPtr)null)
            {
                Win32.DeleteDC(this._hDC);
                this._hDC = (IntPtr)null;
            }
            Win32.DeleteObject(this._hBitmap);
            this._hBitmap = (IntPtr)null;
            return(false);
        }