CWnd zu IplImage bringen [GELÖST]



  • Guten Tag,
    wie der Titel schon sagt, versuche ich ein Bild in Form
    einer OpenCV Bildstrucktur (IplImage) von einem Windowsfenster
    zu erzeugen. Es geht mir hier nur um den Clientbereich.
    Ich hab schon "zuviel" Zeit investiert um das selbst
    hinzubekommen deswegen such ich Hilfe.

    Hier ist mein bisheriger Code von der Funktion.

    IplImage *CWndtoIpl(CWnd *pWnd)
    {
        HWND hWnd = pwindow->GetSafeHwnd();
    
        CRect rect;
        pWnd->GetClientRect(rect);
    
        int     nWidth  = rect.right;
        int     nHeight = rect.bottom;
    
            HDC     hdc     = ::GetDC(hWnd);
        HDC     memDC   = ::CreateCompatibleDC(hdc);
        HBITMAP hbm     = ::CreateCompatibleBitmap(hdc, nWidth, nHeight);
        HBITMAP hbmOld  = (HBITMAP)::SelectObject(memDC, hbm);
    
        BITMAPINFO bmi;
        ZeroMemory(&bmi, sizeof(bmi));
        bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
        bmi.bmiHeader.biWidth        = nWidth;
        bmi.bmiHeader.biHeight       = nHeight;
        bmi.bmiHeader.biBitCount     = 24;
        bmi.bmiHeader.biPlanes       = 1;
        bmi.bmiHeader.biCompression  = BI_RGB;
        bmi.bmiHeader.biSizeImage    = 32 * nWidth * nHeight / 8;
    
            BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage];
    
        BITMAPFILEHEADER bfh;
        bfh.bfType      = ('M' << 8) + 'B';
        bfh.bfSize      = sizeof(BITMAPFILEHEADER)  +
                              bmi.bmiHeader.biSizeImage +
                              sizeof(BITMAPINFOHEADER);
        bfh.bfReserved1 = 0;
        bfh.bfReserved2 = 0;
        bfh.bfOffBits   = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
    
    //  BitBlt(*hDC, 0, 0, GetSystemMetrics(SM_CXSCREEN)-1,GetSystemMetrics(SM_CYSCREEN)-1,memDC, 0, 0, SRCCOPY);
    
      HANDLE hfile = CreateFile( "__TMP__SCRNSHOT__2357__.BMP",
                                 GENERIC_WRITE,
                                 0,
                                 0,
                                 CREATE_ALWAYS,
                                 0,
                                 0 );
    
          DWORD dwWritten;
          WriteFile(hfile,&bfh,           sizeof(bfh),               &dwWritten, NULL);
          WriteFile(hfile,&bmi.bmiHeader, sizeof(BITMAPINFOHEADER),  &dwWritten, NULL);
          WriteFile(hfile,pbBits,         bmi.bmiHeader.biSizeImage, &dwWritten, NULL);
    
        BITMAP bmp;
    
        ::GetObject(hbm,sizeof(BITMAP),&bmp);
    
        int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;
        int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;
    
        IplImage* img = cvCreateImageHeader( cvSize(bmp.bmWidth, bmp.bmHeight), depth, nChannels );
    
        img->imageData = (char*)malloc(bmp.bmHeight * bmp.bmWidth * nChannels * sizeof(char));
    
    //_____________________________________________________________________________________________   
        memcpy(img->imageData,(char*)(bmp.bmBits), bmp.bmHeight * bmp.bmWidth * nChannels);
        //memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
    //_____________________________________________________________________________________________
    
        CloseHandle(hfile);
          ::SelectObject(memDC, hbmOld);
          ::DeleteDC(memDC);
          ::ReleaseDC(hWnd,hdc);
          ::DeleteDC(hdc);
          ::DeleteObject(hbm);
          ::DeleteObject(hbmOld);
          ::DeleteObject(hWnd);
          hbm=NULL;
          hbmOld=NULL;
          delete[] pbBits;
    
          return img;
    
    }
    

    Ich denke es ist nicht mehr viel zu machen, aber ich komme einfach
    nicht dahinter. Der Fehler ist, dass bei der 70.Zeile bmp.bmBits immer "0x000..." ist.
    Hier ist noch der thread bei dem ich das Problem schonmal gepostet hab:
    http://www.c-plusplus.net/forum/293206
    Ich würde jetz mal sagen, dass derjenige der den Fehler behebt und mir
    die Fehlerlose Funktion zukommen lässt, denjenigen würde ich nen 10ner
    überweisen.

    Für Rückfragen stehe ich gerne zur Verfügung.

    MfG, Benni



  • Flasches Forum ?



  • 7xCore schrieb:

    Flasches Forum ?

    Auftragsarbeit.



  • Ich habe es mitlerweile selbst hinbekommen,
    trotzdem danke falls sich schon jemand damit
    befasst hat.

    MfG, Benni


Anmelden zum Antworten