Folgendes Problem:
Ein Abbild vom Desktop wird erstellt und die Bits werden mit passenden Bitmapheadern erfolgreich als Bitmap gespeichert.
Sprich ich bin schonmal sicher, dass ich die Bildinformationen richtig einlese und speicher.
Die Bits befinden sich also im Array pbBits.
Bitmap-typisch sind die Bildinformationen schon upside-down im Array,
daher geben auch pbBits[0], pbBits[1] und pbBits[2] Farbinformationen (BGR) des linken Pixel der untersten Zeile.
Auch die restlichen Pixel dieser Zeile haben die richtigen farbwerte (Ich habs manuell überprüft anhand des abgespeicherten Bildes).
Meine Bildschirmbreite ist 1366 und die Höhe 768.
Wenn ich nun also die nächste Zeile auslesen will, wäre dies doch Pixel 1366+1, daher pbBits[4101],pbBits[4102],pbBits[4103](hoffe bringe hier logische dinge nicht durcheinander). Leider stimmen diese Farbwerte nicht mit denen des Bildes überein, daher gehe ich nun davon aus, dass die Fehlerquelle hier liegt.
Erkennt jemand von euch Unstimmigkeiten? Oder kennt ganz und gar eine bessere möglichkeit?
hier die Funktion:
Vielen Dank für eure Aufmerksamkeit ;)
peace out
Ein Abbild vom Desktop wird erstellt und die Bits werden mit passenden Bitmapheadern erfolgreich als Bitmap gespeichert.
Sprich ich bin schonmal sicher, dass ich die Bildinformationen richtig einlese und speicher.
Die Bits befinden sich also im Array pbBits.
Bitmap-typisch sind die Bildinformationen schon upside-down im Array,
daher geben auch pbBits[0], pbBits[1] und pbBits[2] Farbinformationen (BGR) des linken Pixel der untersten Zeile.
Auch die restlichen Pixel dieser Zeile haben die richtigen farbwerte (Ich habs manuell überprüft anhand des abgespeicherten Bildes).
Meine Bildschirmbreite ist 1366 und die Höhe 768.
Wenn ich nun also die nächste Zeile auslesen will, wäre dies doch Pixel 1366+1, daher pbBits[4101],pbBits[4102],pbBits[4103](hoffe bringe hier logische dinge nicht durcheinander). Leider stimmen diese Farbwerte nicht mit denen des Bildes überein, daher gehe ich nun davon aus, dass die Fehlerquelle hier liegt.
Erkennt jemand von euch Unstimmigkeiten? Oder kennt ganz und gar eine bessere möglichkeit?
hier die Funktion:
Code:
int CaptureScreen(){
// RETURN VALUES
// 0 failure
// 1 Success
//
int nWidth = GetSystemMetrics(SM_CXSCREEN);
int nHeight = GetSystemMetrics(SM_CYSCREEN);
HWND hWnd = GetDesktopWindow();
HDC hdc = GetDC(hWnd);
HDC memDC = CreateCompatibleDC(hdc);
HBITMAP hbm = CreateCompatibleBitmap(hdc, nWidth, nHeight);
HBITMAP hbmOld = (HBITMAP)SelectObject(memDC, hbm);
BitBlt(memDC, 0, 0, nWidth, nHeight, hdc, 0, 0, SRCCOPY);
BITMAPINFO 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 = 4 * nWidth * nHeight;
BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage];
GetDIBits( memDC,hbm,0,bmi.bmiHeader.biHeight,pbBits,&bmi,DIB_RGB_COLORS );
////Alle Informationen die eine Bitmap braucht hier der Fileheader
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);
//speichern
HANDLE hfile = CreateFile(L"c:\\temp\\screen.bmp",GENERIC_WRITE,0,0,OPEN_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);
CloseHandle(hfile);
//verarbeitung
int xxPos=750,yyPos=300;
//TEST um zu gucken wie das Array nun wirklich aufgebaut ist... 1. zeile (yyPos=0) klappt ganz gut und stimmt
//jedoch ab Zeile 2 yyPos=1 stimmen die Farbwerte nicht mit den manuell bestimmten Werten überein.
FILE *fp;
fp=fopen("c:\\temp\\test.txt", "w");
fprintf(fp, "%d.",pbBits[yyPos*nWidth + xxPos*3]); //blau
fprintf(fp, "%d.",pbBits[yyPos*nWidth + xxPos*3+1]); //gruen
fprintf(fp, "%d.",pbBits[yyPos*nWidth + xxPos*3+2]); //rot
fprintf(fp, "# x%d y%d",xxPos,yyPos);
fprintf(fp, "-------");
fclose(fp);
//clean up
SelectObject(memDC, hbmOld);
DeleteDC(memDC);
ReleaseDC(hWnd,hdc);
DeleteObject(hbm);
delete[] pbBits;
return 1;
}
peace out