<?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[Probleme mit der Umwandlung eines Bildes in ein monochromes Bild]]></title><description><![CDATA[<p>Wenn ich ein normales Bild monochrom anzeigen will, wobei ich eine Farbe als Hintergrund definiere, während alle anderen Farben den Vordergrund darstellen, muß ich ja folgendes machen:</p>
<pre><code class="language-cpp">CClientDC clientDC (this);
CBitmap bmp, bmpMono;
CDC dc, dcMono;
BITMAP bm;

bmp.LoadBitmap (IDB_BITMAP);
dc.CreateCompatibleDC (&amp;clientDC);
dc.SelectObject (&amp;bmp);

bmp.GetBitmap (&amp;bm);

bmpMono.CreateBitmap (bm.bmWidth, bm.bmHeight, 1, 1, NULL);
dcMono.CreateCompatibleDC (&amp;clientDC);
dcMono.SelectObject (&amp;bmpMono);

/*Übertragen des normalen Bildes in das monochrome,
  wobei die Farbe Rot als Hintergrundfarbe gilt.*/
dc.SetBkColor (0xff);
dcMono.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &amp;dc, 0, 0, SRCCOPY);

//Anzeigen des monochromen Bildes
clientDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &amp;dcMono, 0, 0, SRCCOPY);
</code></pre>
<p>Jetzt ist es allerdings so, daß der Vordergrundbereich schwarz ist, während der Hintergrung weiß ist. Ich hätte es aber gern genau umgedreht: Das, was ursprünglich rot (Hintergrund) war, soll schwarz sein, während alles andere weiß ist. Und das bitte, ohne jeden Pixel mit SetPixel umzudrehen. Wer kann mir da helfen?</p>
<p>Für alle die, die es interessiert, wieso ich das will:<br />
Wenn man Kollisionsabfrage von zwei Sprites überprüft, packt man ja den Bereich des Sprites, der sich mit dem anderen überschneidet, monochrom in ein Feld vom Typ BYTE, der dann pro Feldeintrag acht Pixel speichert. Und dann überprüft man die Feldeinträge per AND- oder OR-Verknüpfung. Wenn nun aber die Pixelanzahl nicht durch acht teilbar ist, schätze ich mal, daß er den Rest mit Nullen, die ja für schwarz stehen, auffüllt. Wenn nun schwarz für den Vordergrund steht, wird in dem Fall durch diese Rest-Bits eine Kollision erkannt, obwohl gar keine stattgefunden hat. Außerdem: Wenn ich auf Kollision überprüfe, wenn weiß (1) der Vordergrund ist, kann ich folgendes schreiben:</p>
<pre><code class="language-cpp">for (i=0; i&lt;Feldlänge (feld1) /*wie auch immer*/; i++)
    if (feld1 [i]&amp;feld2 [i]!=0)
        return true;
</code></pre>
<p>Wäre jetzt schwarz (0) der Vordergrund, müßte ich es ja so schreiben:</p>
<pre><code class="language-cpp">for (i=0; i&lt;Feldlänge (feld1); i++)
    if (feld1 [i]|feld2 [i]!=255)
        return true;
</code></pre>
<p>Und da ist die erste Version natürlich wesentlich eleganter.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/149884/probleme-mit-der-umwandlung-eines-bildes-in-ein-monochromes-bild</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 05:00:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/149884.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 11 Jun 2006 00:03:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit der Umwandlung eines Bildes in ein monochromes Bild on Sun, 11 Jun 2006 00:03:09 GMT]]></title><description><![CDATA[<p>Wenn ich ein normales Bild monochrom anzeigen will, wobei ich eine Farbe als Hintergrund definiere, während alle anderen Farben den Vordergrund darstellen, muß ich ja folgendes machen:</p>
<pre><code class="language-cpp">CClientDC clientDC (this);
CBitmap bmp, bmpMono;
CDC dc, dcMono;
BITMAP bm;

bmp.LoadBitmap (IDB_BITMAP);
dc.CreateCompatibleDC (&amp;clientDC);
dc.SelectObject (&amp;bmp);

bmp.GetBitmap (&amp;bm);

bmpMono.CreateBitmap (bm.bmWidth, bm.bmHeight, 1, 1, NULL);
dcMono.CreateCompatibleDC (&amp;clientDC);
dcMono.SelectObject (&amp;bmpMono);

/*Übertragen des normalen Bildes in das monochrome,
  wobei die Farbe Rot als Hintergrundfarbe gilt.*/
dc.SetBkColor (0xff);
dcMono.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &amp;dc, 0, 0, SRCCOPY);

//Anzeigen des monochromen Bildes
clientDC.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &amp;dcMono, 0, 0, SRCCOPY);
</code></pre>
<p>Jetzt ist es allerdings so, daß der Vordergrundbereich schwarz ist, während der Hintergrung weiß ist. Ich hätte es aber gern genau umgedreht: Das, was ursprünglich rot (Hintergrund) war, soll schwarz sein, während alles andere weiß ist. Und das bitte, ohne jeden Pixel mit SetPixel umzudrehen. Wer kann mir da helfen?</p>
<p>Für alle die, die es interessiert, wieso ich das will:<br />
Wenn man Kollisionsabfrage von zwei Sprites überprüft, packt man ja den Bereich des Sprites, der sich mit dem anderen überschneidet, monochrom in ein Feld vom Typ BYTE, der dann pro Feldeintrag acht Pixel speichert. Und dann überprüft man die Feldeinträge per AND- oder OR-Verknüpfung. Wenn nun aber die Pixelanzahl nicht durch acht teilbar ist, schätze ich mal, daß er den Rest mit Nullen, die ja für schwarz stehen, auffüllt. Wenn nun schwarz für den Vordergrund steht, wird in dem Fall durch diese Rest-Bits eine Kollision erkannt, obwohl gar keine stattgefunden hat. Außerdem: Wenn ich auf Kollision überprüfe, wenn weiß (1) der Vordergrund ist, kann ich folgendes schreiben:</p>
<pre><code class="language-cpp">for (i=0; i&lt;Feldlänge (feld1) /*wie auch immer*/; i++)
    if (feld1 [i]&amp;feld2 [i]!=0)
        return true;
</code></pre>
<p>Wäre jetzt schwarz (0) der Vordergrund, müßte ich es ja so schreiben:</p>
<pre><code class="language-cpp">for (i=0; i&lt;Feldlänge (feld1); i++)
    if (feld1 [i]|feld2 [i]!=255)
        return true;
</code></pre>
<p>Und da ist die erste Version natürlich wesentlich eleganter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1075361</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1075361</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Sun, 11 Jun 2006 00:03:09 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit der Umwandlung eines Bildes in ein monochromes Bild on Sun, 11 Jun 2006 00:13:09 GMT]]></title><description><![CDATA[<p>P.S.: Mir ist natürlich klar, daß ich mal schnell durch das Feld durchrattern und jeden Eintrag mit</p>
<pre><code class="language-cpp">feld [i]=~feld [i]
</code></pre>
<p>umwandeln könnte. Aber ich würd gern wissen, ob es da etwas gibt, das das gleich innerhalb der Grafik so darstellt, wie ich es haben will.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1075362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1075362</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Sun, 11 Jun 2006 00:13:09 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit der Umwandlung eines Bildes in ein monochromes Bild on Sun, 11 Jun 2006 18:21:02 GMT]]></title><description><![CDATA[<p>Hat sich erledigt.</p>
<p>Die Lösung:<br />
Um das monochrome Bild entsprechend andersherum zu erstellen, muß man einfach</p>
<pre><code class="language-cpp">dcMono.BitBlt (0, 0, bm.bmWidth, bm.bmHeight, &amp;dc, 0, 0, NOTSRCCOPY);
</code></pre>
<p>schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1075796</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1075796</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Sun, 11 Jun 2006 18:21:02 GMT</pubDate></item></channel></rss>