<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Pixelfeld aus DC auslesen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>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 &quot;Screenshoot&quot; 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.<br />
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.</p>
<p>Lange Rede kurzer Sinn, hier der fehlerhafte Code:</p>
<pre><code class="language-cpp">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&lt;17974; detected_color[counter++]=100);      // Array initialisieren

	chat_handle = win_instance.findchat();           // Handle laden
	::GetWindowRect(chat_handle, &amp;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,&amp;screen_dc,0,0,SRCCOPY);    // Screenshot machen

        //Pixel auslesen
	for(int x_counter=0; x_counter &lt; 209; x_counter++)
		for(int y_counter=0;y_counter &lt; 86; y_counter++)
			detected_color[x_counter+y_counter] = win_dc.GetPixel(x_counter,y_counter);
</code></pre>
<p>Danke fürs drüber schauen!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/182715/pixelfeld-aus-dc-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 15 Apr 2026 07:05:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/182715.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 28 May 2007 14:07:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pixelfeld aus DC auslesen on Mon, 28 May 2007 14:07:53 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>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 &quot;Screenshoot&quot; 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.<br />
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.</p>
<p>Lange Rede kurzer Sinn, hier der fehlerhafte Code:</p>
<pre><code class="language-cpp">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&lt;17974; detected_color[counter++]=100);      // Array initialisieren

	chat_handle = win_instance.findchat();           // Handle laden
	::GetWindowRect(chat_handle, &amp;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,&amp;screen_dc,0,0,SRCCOPY);    // Screenshot machen

        //Pixel auslesen
	for(int x_counter=0; x_counter &lt; 209; x_counter++)
		for(int y_counter=0;y_counter &lt; 86; y_counter++)
			detected_color[x_counter+y_counter] = win_dc.GetPixel(x_counter,y_counter);
</code></pre>
<p>Danke fürs drüber schauen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293789</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293789</guid><dc:creator><![CDATA[Richard]]></dc:creator><pubDate>Mon, 28 May 2007 14:07:53 GMT</pubDate></item><item><title><![CDATA[Reply to Pixelfeld aus DC auslesen on Mon, 28 May 2007 18:13:47 GMT]]></title><description><![CDATA[<p>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 <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> ).</p>
<p>Mein Vorschlag:<br />
1. Handle (hdc) von der Quelle hohlen<br />
2. über das Quellhandle die aktuelle Bitmap der Quellhandles hohlen (GetCurrentBitmap)<br />
3. die größe der Bitmap ermitteln<br />
4. die die Bits der Bitmap hohlen (GetBitmapBits)<br />
5. die Werte mit den for-Schleifen in dein Array übertragen oder schneller, alles von a nach b copieren (memcopy)</p>
<p>Gruß Matthias</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1293978</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1293978</guid><dc:creator><![CDATA[CTecS]]></dc:creator><pubDate>Mon, 28 May 2007 18:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to Pixelfeld aus DC auslesen on Tue, 29 May 2007 07:05:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">//Pixel auslesen
	for(int x_counter=0; x_counter &lt; 209; x_counter++)
		for(int y_counter=0;y_counter &lt; 86; y_counter++)
			detected_color[x_counter+y_counter*209] = win_dc.GetPixel(x_counter,y_counter*209);
</code></pre>
<p>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.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294197</guid><dc:creator><![CDATA[Schmiddie]]></dc:creator><pubDate>Tue, 29 May 2007 07:05:44 GMT</pubDate></item><item><title><![CDATA[Reply to Pixelfeld aus DC auslesen on Tue, 29 May 2007 13:22:18 GMT]]></title><description><![CDATA[<p>Vielen Dank, die falsche Indexierung war das Problem. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1294464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1294464</guid><dc:creator><![CDATA[Richard]]></dc:creator><pubDate>Tue, 29 May 2007 13:22:18 GMT</pubDate></item></channel></rss>