Pixelabfrage mit CreateDibSection
-
Hallo Zusammen,
ich möchte einen bestimmten Bereich meines Desktops nach einer bestimmten
Pixelfarbe in sich immer wiederholenden Abständen durchsuchen lassen. Das Ganze
soll im Hintergrund laufen (habe WinXP Prof) und so schnell wie möglich den
gewünschten Bereich durchscannen. Mit "GetPixel" kann man das schon ganz
gut machen (siehe nachstehenden Code als Beispiel) aber bei grösseren Bereichen
ist "GetPixel" halt sehr langsam.Mittlerweile habe ich mitbekommen (habe schonmal einen Beitrag zum Thema geschrieben)
dass es eine schnellere Möglichkeit mit "CreateDIBSection" gibt (siehe nachstehendes
Code-Beispiel). Aber was macht denn "CreateDIBSection" genau? Habe ich es richtig ver-
standen dass man damit einen Speicherbereich für ein Bitmap reserviert? Aber wie lade
ich dann dann den gewünschten Bildschirmbereich, den ich durchsuchen möchte, in die
Section? Und wie lese ich dann die Pixelwerte aus der Section aus? Wer kann mir mal
ein funktionierendes Code-beispiel posten und ein bisschen erklären was da passiert.
Supergrosses Dankeschön für jede Hilfe!gruss, rommi (C++ Anfänger)
****** Beispiel mit GetPixel ************
int hoch, breit; HDC dc = GetDC(0); int GesuchtesPix = 16777215; while(true) { for(hoch=100; hoch < 500; hoch++) { for(breit=200; breit < 800; breit++) { //=========== Desktop-Pixelfarbe ermitteln COLORREF Deskpix = GetPixel(dc, breit, hoch); //=========== Desktop-Pixelfarbe mit Suchpixel vergleich if(Deskpix == GesuchtesPix) { //weiteren Code ausführen } } } }****** Beispiel mit CreateDIBSection *****
// Deklaration HDC hdc_Bildschirm; BITMAPINFO bmi; LPBYTE pBits; int x=500; int y=800; // Festerid des Desktops ermitteln HWND desktopHandle = GetDesktopWindow(); // Gerätekontext von Desktop-Fensterid erzeugen hdc_Bildschirm = GetDC(desktopHandle); // ?? ZeroMemory(&bmi, sizeof(bmi)); // Parameter für die DIBSection mit Werten belegen bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = x; bmi.bmiHeader.biHeight = y; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biCompression = BI_RGB; /* Hier wird scheinbar die Section erstellt bezogen auf den ganzen Bildschirm. Eigentlich wollte ich ja nur einen Teil des Bildschirms durchsuchen */ HBITMAP hdcBmp = CreateDIBSection(hdc_Bildschirm, &bmi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0); /* Wie gehts weiter? wie kann ich jetzt die Pixels (bzw. Pixelfarbe) des gewünschten Desktopsbereichs auslesen damit ich die Info dann weiterverarbeiten kann */
-
bzgl. DIB section und Bitmaps liest man am besten im Petzold nach. Die Zeit dafuer sollte man sich nehmen, da man sonst nur am rumfrickeln ist, ohne die Mechanismen zu verstehen, mit denen man zu tun hat.
in wenigen Worten gefasst: eine DIB section ist wie der Name schon sagt ein "device independent bitmap", das Besondere ist, dass man einen Zeiger auf die Pixeldaten des Bitmaps bekommt. Zwischen DDB = "device dependent bitmap" (also z.B. dem Bildschirm-Bitmap) und dem DIB kann man per BitBlt (oder StretchBlt, PlgBit und ggf. anderen) die Pixeldaten schieben, dabei werden sie in das von dir angegeben Format konvertiert.
-
Hallo Superlexx,
nich schon wieder ein Buch kaufen
Habe mir letzte Woche "Einstieg in Visual C++.." von Andre Willms für 29.99 gekauft und ich hab nicht ganz soviel Geld zur Verfügung wie die Aldi-Brüder. Steht einiges Basiswissen drin aber dann beisst es auch schon aus. Da steht nicht einmal drin was "struct" macht 
Zumindest stand es nicht im Stichwortverzeichnis und die 600 Seiten habe ich einfach noch nicht durchgelesen
Danke auf jeden Fall mal für den Tip, scheint ein gutes Buch zu sein! Schade dass keiner auf die Schnelle ein brauchbares Schipsel zur Verfügung hat. Habe gestern mal nach weiteren C++Foren geguckelt da scheint c-plusplus.net sowieso schon das Nonplusultra der deutschsprachigen Foren zu sein, da werd ich es wohl mal in englischsparchigen Foren probieren.Gruss, rommi