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


Anmelden zum Antworten