revelation
Mitglied
Hallo zusammen,
ich habe eine Anwendung, die ca. 25-30 mal einen Screenshot des aktuell gezeigten Desktops auslesen soll.
Die Daten müssen als Byte-Array vorliegen.
Das einzige Problem ist die Geschwindigkeit: Ich schaffe mit folgendem Code auf meinem Rechner (AthlonXP 2800+; 1024*768; 32BPP) nur 20-21 Bilder/sec.
Weil die Daten Anschließend noch komprimiert werden müssen, ist das nicht tragbar.
Hier der Code:
Hat jemand eine Ahnung, wie man das beschleunigen könnte?
Wichtig ist nur der Pointer auf die Bitmapdaten.
Dank schonmal
Johannes
ich habe eine Anwendung, die ca. 25-30 mal einen Screenshot des aktuell gezeigten Desktops auslesen soll.
Die Daten müssen als Byte-Array vorliegen.
Das einzige Problem ist die Geschwindigkeit: Ich schaffe mit folgendem Code auf meinem Rechner (AthlonXP 2800+; 1024*768; 32BPP) nur 20-21 Bilder/sec.
Weil die Daten Anschließend noch komprimiert werden müssen, ist das nicht tragbar.
Hier der Code:
Code:
//pBits sei char ** und *pBits zeige auf ausreichend viel reservierten Speicher
// Bitmappuffer erstellen
HWND hWndDesktop = GetDesktopWindow(); // Handle auf Bildschirmfenster erhalten
HDC hDCDesktop = GetWindowDC(hWndDesktop); // DeviceContext erhalten
HDC hDCMem = CreateCompatibleDC(hDCDesktop); // kompatiblen DC erstellen
int width = GetDeviceCaps(hDCDesktop, HORZRES); // Bildschirmbreite ermitteln
int height = GetDeviceCaps(hDCDesktop, VERTRES); // Bildschrimhöhe ermitteln
HBITMAP bmpMem = CreateCompatibleBitmap(hDCDesktop, width, height); // Puffer erstellen
// Bitmap mit dem DC "verbinden"
SelectObject(hDCMem, bmpMem);
// Bitmap-Info setzen
ZeroMemory(&bmi, sizeof(bmi));
// Infos übertragen
bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader);
bmi.bmiHeader.biWidth = width;
bmi.bmiHeader.biHeight = height;
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 16; // Ist aus Kompressionsgründen 16
bmi.bmiHeader.biCompression = BI_RGB;
// Bildschirminhalt in den Puffer übertragen
if(!BitBlt(hDCMem, 0, 0, bmi.bmiHeader.biWidth, bmi.bmiHeader.biHeight, hDCDesktop, 0, 0, SRCCOPY))
return 0;
// Pointer auf Bitmapdaten erhalten
if(!GetDIBits(hDCMem, bmpMem, 0, bmi.bmiHeader.biHeight, *pBits, &bmi, DIB_RGB_COLORS))
return 0;
// Bitmappuffer aufräumen
DeleteDC(hDCMem);
DeleteObject(bmpMem);
ReleaseDC(hWndDesktop, hDCDesktop);
Hat jemand eine Ahnung, wie man das beschleunigen könnte?
Wichtig ist nur der Pointer auf die Bitmapdaten.
Dank schonmal
Johannes
Zuletzt bearbeitet: