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