Pixelfeld aus DC auslesen



  • Hallo zusammen,

    bin dabei eine Anwendung zu schreiben, die den Inhalt eines bestimmten Teilfensters einer anderen Anwendung auswerten soll. Ich habe mir den HWND auf dieses Subfenster besorgt und möchte nun gern Pixel für Pixel aus dem "Screenshoot" auslesen. Nur irgendwie macht der Code noch nicht ganz was er soll, denn die Hintergrundfarbe des Screenshoots ist eigentlich schwarz. Mein Array enthält aber nach dem Auslesen kaum schwarz. Denn soweit ich das verstanden habe, sollte bei GetPixel() für schwarz ja 0 zurückgeliefert werden. Komischerweise wird es auch nur bis [294] gefüllt - alle Felder danach enthalten den Initialisierungswert 100.
    Ich denke das ganze Problem ist, dass ich micht mit den DC Handlern nicht wirklich auskenne und da wohl irgendwas vergessen oder verdreht habe, wie auch immer.

    Lange Rede kurzer Sinn, hier der fehlerhafte Code:

    HWND chat_handle;                     // Handle auf das Subfenster
    	RECT rcWindow;                        // Groesse des Subfensters
    	COLORREF detected_color[17974];       // zum Speichern jedes einzelnen Pixels (Fenster 209x86)
    
    	for(int counter=0;counter<17974; detected_color[counter++]=100);      // Array initialisieren
    
    	chat_handle = win_instance.findchat();           // Handle laden
    	::GetWindowRect(chat_handle, &rcWindow);         // Fenstergroesse bestimmen
    	CClientDC screen_dc(CWnd::FromHandle(chat_handle));          // Quellfenster
    	CClientDC win_dc(NULL);                                      //Zieldevice
    
    	win_dc.BitBlt(0,0,rcWindow.right-rcWindow.left,rcWindow.bottom-rcWindow.top,&screen_dc,0,0,SRCCOPY);    // Screenshot machen
    
            //Pixel auslesen
    	for(int x_counter=0; x_counter < 209; x_counter++)
    		for(int y_counter=0;y_counter < 86; y_counter++)
    			detected_color[x_counter+y_counter] = win_dc.GetPixel(x_counter,y_counter);
    

    Danke fürs drüber schauen!



  • ich kann mir nicht vorstellen, das dein code wirklich wie beschrieben läuft, da dein ZielDC keine Bitmap hat, wo wird da also hingeblittet? (Kann aber auch selbst falsch liegen 😕 ).

    Mein Vorschlag:
    1. Handle (hdc) von der Quelle hohlen
    2. über das Quellhandle die aktuelle Bitmap der Quellhandles hohlen (GetCurrentBitmap)
    3. die größe der Bitmap ermitteln
    4. die die Bits der Bitmap hohlen (GetBitmapBits)
    5. die Werte mit den for-Schleifen in dein Array übertragen oder schneller, alles von a nach b copieren (memcopy)

    Gruß Matthias



  • //Pixel auslesen
    	for(int x_counter=0; x_counter < 209; x_counter++)
    		for(int y_counter=0;y_counter < 86; y_counter++)
    			detected_color[x_counter+y_counter*209] = win_dc.GetPixel(x_counter,y_counter*209);
    

    Auf jeden Fall musst du das so machen, wenn du jeden Pixel ansprechen willst. Mit deiner Methode hast du ja statt der vollen 17974 Pixel nur die ersten 209+86 Pixel angesprochen.



  • Vielen Dank, die falsche Indexierung war das Problem. 😃


Anmelden zum Antworten