bild von webcam ausgeben und drauf zugreifen können



  • hallo,

    ich "ziehe" mir ein bild von meiner webcam mittels folgendem code:

    ::SendMessage( hwndCapture_, WM_CAP_GRAB_FRAME, 0, 0 );
      ::SendMessage( hwndCapture_, WM_CAP_EDIT_COPY, 0, 0 );
    
      if ( !::OpenClipboard( GetSafeHwnd() ) )
      {
        ::MessageBox( GetSafeHwnd(), "Konnte ClipBoard nicht anfordern.", "Fehler!", 0 );
        return FALSE;
      }
    
      MessageBox("hier");
    
      hBitmap = (HBITMAP)GetClipboardData( CF_DIB );
      if ( hBitmap == NULL )
      {
        CloseClipboard();
        ::MessageBox( GetSafeHwnd(), "Das Clipboard ist leer!", "Fehler", 0 );
        return FALSE;
      }
    

    das image sollte nun in hBitmap sein... jedenfalls ist es nicht mehr NULL 🙂

    nun versuche ich es in der OnDraw() auszugeben:

    CBitmap lol;
    		lol.FromHandle(hBitmap);
    
    		CDC *test = new CDC;
    		test->CreateCompatibleDC(pDC);
    		test->SelectObject(lol);
    
    		pDC->BitBlt(10,10,100,100,test,0,0,SRCCOPY);
    

    es wird allerdings nichts ausgegeben!

    wenn ich aber ein bild auf die gleiche art aus den resourcen ausgebe wird dieses angezeigt:

    CBitmap lol2;
    		lol2.LoadBitmap(IDB_BITMAP1);
    
    		CDC* test2 = new CDC;
    		test2->CreateCompatibleDC(pDC);
    		test2->SelectObject(lol2);
    
    		pDC->BitBlt(200,10,100,100,test2,0,0,SRCCOPY);
    

    warum wird das bild von der webcam nicht angezeigt?

    p.s: ich mache das so mit den device-contexten da ich zugriff auf jedes
    einzelne pixel über GetPixel haben möchte...



  • aber das Bitmap (hBitmap) müsste doch eig. ausgegeben werden oder?
    mache ich was falsch?

    babel



  • versuch mal statt:

    lol.FromHandle(hBitmap);
    
    lol.Attach(hBitmap);
    


  • hmm ...

    static CBitmap* PASCAL FromHandle(
       HBITMAP hBitmap 
    );
    
    CBitmap* pClipBoardBitmap = CBitmap::FromHandle(hBitmap);
    
    if (pClipBoardBitmap == NULL)
        return;
    
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = dcMem.SelectObject(pClipBoardBitmap);
    
    pDC->BitBlt(10, 10, 100, 100, &dcMem, 0, 0, SRCCOPY);
    dcMem.SelectObject(pOldBitmap);
    dcMem.DeleteDC();
    pClipBoardBitmap->DeleteObject();
    // delete pClipBoardBitmap;
    

    Oder so ähnlich ^^



  • @ (D)Evil

    hey danke dir schonmal... aber das klappt leider nicht :-|
    nicht das der fehler der ist, das mein hBitmap nicht richtig gefüllt ist?!

    aber hBitmap ist != NULL !!

    hmm...



  • Dann geh mitn Debugger durch und guck ob er bei
    if (pClipBoardBitmap == NULL)
    return;
    rausspringt...



  • also der fehler liegt wohl daran wie ich das HBITMAP fülle...
    also ich möchte ja ein bild von meiner webcam capturen. das mache
    ich hiermit:

    ::SendMessage( hwndCapture_, WM_CAP_GRAB_FRAME, 0, 0 );
      ::SendMessage( hwndCapture_, WM_CAP_EDIT_COPY, 0, 0 );
    
      if ( !::OpenClipboard( GetSafeHwnd() ) )
      {
        ::MessageBox( GetSafeHwnd(), "Konnte ClipBoard nicht anfordern.", "Fehler!", 0 );
        return FALSE;
      }
    
      hBitmap = (HBITMAP)GetClipboardData( CF_DIB );
      if ( hBitmap == NULL )
      {
        CloseClipboard();
        ::MessageBox( GetSafeHwnd(), "Das Clipboard ist leer!", "Fehler", 0 );
        return FALSE;
      }
    

    und dieses auszugeben klappt nicht...

    wenn ich das HBITMAP aber einfach so fülle:

    hBitmap = (HBITMAP)::LoadImage(AfxGetInstanceHandle(),"c:\\bitmap.bmp", IMAGE_BITMAP, 0, 0,LR_LOADFROMFILE | LR_CREATEDIBSECTION);
    

    dann wird es ausgegeben :-|



  • bei dem versuch das bild von der webcam zu zeichnen tritt ein fehler
    bei "SelectObejct" auf!

    CBitmap* pClipBoardBitmap = CBitmap::FromHandle(hBitmap);
    
    if (pClipBoardBitmap == NULL)
        return;
    
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap* pOldBitmap = dcMem.SelectObject(pClipBoardBitmap);
    
    pDC->BitBlt(10, 10, 100, 100, &dcMem, 0, 0, SRCCOPY);
    dcMem.SelectObject(pOldBitmap); // SCHLÄGT FEHL !!!
    dcMem.DeleteDC();
    pClipBoardBitmap->DeleteObject();
    

    von daher denke ich das das bild nicht richtig eingelesen wird :-|



  • ja lag daran 🙂

    danke euch! 🙂


Log in to reply