用了avicap32.dll用摄像头拍照,并保存图像,。但是我想把图像直接保存在内存流是不是调用这个静态方法capSetCallbackOnFrame,若是我不知道怎么调用并不知道它的参数.请各位高手帮忙啊,先谢谢了

解决方案 »

  1.   

    LRESULT   CALLBACK   CCapture::VideoCallbackProc(HWND   hWnd,   LPVIDEOHDR   lpVHdr) 
    {         if(   m_pStaticCap-> m_hwndParent   ) ::PostMessage(   m_pStaticCap-> m_hwndParent   ,   WM_CAPTUREONE   ,   (LPARAM)lpVHdr-> dwBufferLength   ,   (WPARAM)lpVHdr-> lpData   )   ;         return   (LRESULT)   TRUE   ; 

    /* 
    //video   data   block   header   
    typedef   struct   videohdr_tag   { 
            LPBYTE             lpData;                                   //pointer   to   locked   data   buffer   
            DWORD               dwBufferLength;                   //   Length   of   data   buffer   
            DWORD               dwBytesUsed;                         //   Bytes   actually   used   
            DWORD               dwTimeCaptured;                   //   Milliseconds   from   start   of   stream   
            DWORD               dwUser;                                   //   for   client 's   use   
            DWORD               dwFlags;                                 //   assorted   flags   (see   defines) 
            DWORD               dwReserved[4];                     //   reserved   for   driver 
    }   VIDEOHDR,   NEAR   *PVIDEOHDR,   FAR   *   LPVIDEOHDR; 
      

  2.   

    http://www.cnblogs.com/oskycar/archive/2009/08/10/1543064.html
      

  3.   


    我学的C# 对于C++不太懂呀,能不能给个C#的例子呀
      

  4.   


     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());
            }
      

  5.   

    谢谢你,我不是想把它保存到文件中而是保存到内存Bitmap流中还要时时的更改不要每次都要读取文件
      

  6.   


    //假设你已经可以拿到位图,那么你可以存到MemoryStream
    Bitmap bm = new Bitmap(width,Height);
    MemoryStream ms = new MemoryStream();
    bm.Save(ms, ImageFormat.Png);
      

  7.   


    这位大侠我要的图片不是从文件中读取的,而是在Aivcap32.dll动态扫描得到的呀,且是时时改变的相当于是时时捕获视频帧
      

  8.   

    我也一直想知道这个问题,可就是没有一人知道。我不要把照片数据放在剪切板上,因为这样,一秒才二张内存Bitmap流,太慢了