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.
