Hallo,
ich versuche mit dem unten stehenden Codeabschnitt einen Scrennshot von einem Fenster zu machen und als Bitmap zwecks Überprüfung auf einem QLabel (Qt Creator) anzuzeigen. Später soll das Bild dann mit Hilfe von OpenCV weiterverarbeitet werden. Dieser "Screenshot" soll außerdem, über einen Slider einstellbar, 1-30 mal pro Sekunde erstellt und angezeigt werden (der Code unten wird dementsprechend wiederholt aufgerufen).
Das funktioniert auch erstmal wie es soll, aber nach einiger Zeit (je höher die Framerate desto früher) scheint CreateCompatibleBitmap() fehlzuschlagen!! LastError ergibt 8, was wohl bedeutet, dass der Speicher (zu) knapp ist??
Was mich irritiert ist, dass es erstmal funktioniert... Habe ich vergessen irgendwas am Ende dieser Prozedur freizugeben, sodass der Speicher vollgemüllt wird o.ä.?? Habe gelesen, dass man wohl auch CreateDIBSection() nehmen kann oder soll (bei hohem Speicheraufkommen), aber ich bin nicht sicher, ob es das ist was ich brauche (hab es auch nicht zum Laufen gebracht)...
Es wäre mir eine große Hilfe, wenn mir jemand auf die Sprünge helfen könnte!
Vielen Dank!
Gruß jacob2
ich versuche mit dem unten stehenden Codeabschnitt einen Scrennshot von einem Fenster zu machen und als Bitmap zwecks Überprüfung auf einem QLabel (Qt Creator) anzuzeigen. Später soll das Bild dann mit Hilfe von OpenCV weiterverarbeitet werden. Dieser "Screenshot" soll außerdem, über einen Slider einstellbar, 1-30 mal pro Sekunde erstellt und angezeigt werden (der Code unten wird dementsprechend wiederholt aufgerufen).
Das funktioniert auch erstmal wie es soll, aber nach einiger Zeit (je höher die Framerate desto früher) scheint CreateCompatibleBitmap() fehlzuschlagen!! LastError ergibt 8, was wohl bedeutet, dass der Speicher (zu) knapp ist??
Code:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <opencv2/opencv.hpp> #include <windows.h> #include <qtimer.h> #include <QMessageBox> QPixmap GetScreenshot (QWidget *parent) { HWND winHandle = FindWindow(NULL, TEXT("Rechner")); HDC hDCMem, hDC; if(!winHandle) { QMessageBox::information(parent, "", "Fenster 'Rechner' nicht gefunden!", QMessageBox::Ok); } hDC = GetWindowDC(winHandle); //GetDC()? if(!hDC) { QMessageBox::information(parent, "", "GetWindowDC() fehlgeschlagen!", QMessageBox::Ok); } hDCMem = CreateCompatibleDC(hDC); if(!hDCMem) { QMessageBox::information(parent, "", "CreateCompatibleDC() fehlgeschlagen!", QMessageBox::Ok); } RECT rc; GetWindowRect(winHandle, &rc); HBITMAP hbitmap = CreateCompatibleBitmap(hDC, rc.right-rc.left, rc.bottom-rc.top); if(!hbitmap) { int error = GetLastError(); QMessageBox::information(parent, "", "CreateCompatibleBitmap() fehlgeschlagen! (Last error = " + QString::number(error) + ")", QMessageBox::Ok); return 0; } SelectObject(hDCMem, hbitmap); if(!BitBlt(hDCMem, 0, 0, rc.right-rc.left, rc.bottom-rc.top, hDC, 0, 0, SRCCOPY)) { //QMessageBox::information(parent, "", "BitBlt() fehlgeschlagen!", QMessageBox::Ok); } QPixmap PixelKarte = QPixmap::fromWinHBITMAP(hbitmap, QPixmap::NoAlpha); ReleaseDC(winHandle, hDC); ReleaseDC(winHandle, hDCMem); DeleteObject(hbitmap); return PixelKarte; }
Es wäre mir eine große Hilfe, wenn mir jemand auf die Sprünge helfen könnte!
Vielen Dank!
Gruß jacob2
Comment