none
[ vb2005 ] VFW複製影像 RRS feed

  • 問題



  • 我用指令capSetCallbackOnVideoStream登記一個CALLBACK函式capVideoStreamCallback(ByVal hwnd As IntPtr, ByRef lpVHdr As VIDEOHDR)

    每次擷取到一個frame時會呼叫這一個函式,並將frame內容當作函式的輸入參數。

    其中lpVHdr是傳回的VIDEOHDR結構

    Structure VIDEOHDR
            Dim lpData As IntPtr
            Dim dwBufferLength As Integer
            Dim dwBytesUsed As Integer
            Dim dwTimeCaptured As Integer
            Dim dwUser As Integer
            Dim dwFlags As Integer
            Dim dwReserved As Integer
        End Structure

    lpData是指向資料的第一個位址
    dwBufferLength 是buffer的長度
    dwBytesUsed是用到的byte

    請問我有了這些資訊,我剛如何把影像顯示到圖片上?

    感恩,謝謝

    2009年10月20日 上午 11:12

解答

  • Private Sub  VideoCallbackProc()
    
        ' Create a new bitmap.
        Dim bmp As New Bitmap( bitmapinfoin.bmiHeader.biWidth, bitmapinfoin.bmiHeader.biHeight, Format24bppRgb)
    
    
        ' Lock the bitmap's bits.  
        Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
        Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect, _
            Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)
    
    
        ' Get the address of the first line.
        Dim ptr As IntPtr = bmpData.Scan0
    
        ' Declare an array to hold the bytes of the bitmap.
        ' This code is specific to a bitmap with 24 bits per pixels.
        Dim bytes As Integer = bmpData.Stride * bmp.Height
      
    
        ' Copy the values back to the bitmap
        System.Runtime.InteropServices.Marshal.Copy(lpVHdr.lpData, 0, ptr, pVHdr.dwBytesUsed)
    
        ' Unlock the bits.
        bmp.UnlockBits(bmpData)
    
    
        bmp.save('0.bmp');
        
    
    End Sub

    Cmf.Net (C) 2009
    • 已標示為解答 Spright 2009年10月23日 上午 10:04
    2009年10月22日 上午 07:27

所有回覆

  • bitmapinfoin的格式要和采集设置的格式相同就可以了   
      ...........................   
        
      BITMAPINFO   bitmapinfoin;   
      HDRAWDIB   hdd;   
        
      bitmapinfoin.bmiHeader.biSize=40;   
      bitmapinfoin.bmiHeader.biWidth=VideoWidth;//176;   
          bitmapinfoin.bmiHeader.biHeight=VideoHeight;//144;   
      bitmapinfoin.bmiHeader.biPlanes=1;   
      bitmapinfoin.bmiHeader.biCompression=0;   
          bitmapinfoin.bmiHeader.biSizeImage=0;   
          bitmapinfoin.bmiHeader.biXPelsPerMeter=0;   
          bitmapinfoin.bmiHeader.biYPelsPerMeter=0;//3779;   
          bitmapinfoin.bmiHeader.biClrUsed=0;   
          bitmapinfoin.bmiHeader.biClrImportant=0;   
          bitmapinfoin.bmiHeader.biBitCount=24;   
        
      hdd=DrawDibOpen();   
        
      .......................   
        
      LRESULT   FAR   PASCAL   VideoCallbackProc(HWND   hWnd,   LPVIDEOHDR   lpVHdr)   
      {   
      //if(busy==TRUE)return   (LRESULT)   TRUE;   
      memcpy(pinbuf,lpVHdr->lpData,lpVHdr->dwBytesUsed);   
          
        
      myDC=GetDC();     
      DrawDibDraw(hdd,     
      myDC->m_hDC,   
      245,40,117,96,   
      (BITMAPINFOHEADER*)&bitmapinfoin,     
      pinbuf,   
      0,0,   
      VideoWidth,   
      VideoHeight,   
      NULL);   
      ReleaseDC(myDC);   
        
                      return(LRESULT)   TRUE;   
      }   
     


    Cmf.Net (C) 2009
    2009年10月21日 上午 01:12
  • [VB.NET/ C#.Net / VC++.Net] 抓 Web Cam 影像存成圖
    http://itgroup.blueshop.com.tw/HammerChou/PowerHammer?n=convew&i=12587

    要試試此篇嗎,比較簡單...
    2009年10月21日 上午 11:36

  • 因為我是想要拿直接從記憶體擷取視訊畫面

    所以不能用存圖的方式來做

    我在google查到的方式都是用指標來弄

    可是VB沒有指標吧...

    所以才想上來問用VB要怎麼處理?
    2009年10月22日 上午 06:49
  • Private Sub  VideoCallbackProc()
    
        ' Create a new bitmap.
        Dim bmp As New Bitmap( bitmapinfoin.bmiHeader.biWidth, bitmapinfoin.bmiHeader.biHeight, Format24bppRgb)
    
    
        ' Lock the bitmap's bits.  
        Dim rect As New Rectangle(0, 0, bmp.Width, bmp.Height)
        Dim bmpData As System.Drawing.Imaging.BitmapData = bmp.LockBits(rect, _
            Drawing.Imaging.ImageLockMode.ReadWrite, bmp.PixelFormat)
    
    
        ' Get the address of the first line.
        Dim ptr As IntPtr = bmpData.Scan0
    
        ' Declare an array to hold the bytes of the bitmap.
        ' This code is specific to a bitmap with 24 bits per pixels.
        Dim bytes As Integer = bmpData.Stride * bmp.Height
      
    
        ' Copy the values back to the bitmap
        System.Runtime.InteropServices.Marshal.Copy(lpVHdr.lpData, 0, ptr, pVHdr.dwBytesUsed)
    
        ' Unlock the bits.
        bmp.UnlockBits(bmpData)
    
    
        bmp.save('0.bmp');
        
    
    End Sub

    Cmf.Net (C) 2009
    • 已標示為解答 Spright 2009年10月23日 上午 10:04
    2009年10月22日 上午 07:27