<?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[Mittelwert verschiedener Uint32 Variablen bilden]]></title><description><![CDATA[<p>Da SDL_gfx momentan noch nicht bei mir läuft und auch einfach so zum basteln habe ich ein AntiAliasing in SDL programmiert. Meine Frage hat aber nichts mit SDL zu tun.</p>
<p>Funktionsweise:</p>
<p>Ich lese die RGBA Daten von vier aneinander liegenden Pixeln aus. z.B. Pixel 1 = 0xFF00FF00. Immer zwei Zeichen stehen für eine Information, also FF = Rotanteil, ... bis 00 = Alphawert.<br />
Nun will ich diese vier Pixel auf einen Pixel legen und muss dazu ja diese vier Uint32 &quot;mischen&quot;, also ihren Mittelwert bilden.</p>
<p>Das habe ich folgendermaßen versucht (wahrscheinlich greift ihr euch jetzt an den Kopf, aber ich weiß es nicht besser):</p>
<pre><code class="language-cpp">farbeDesNeuenPixels = (farbe1 + farbe2 + farbe3 + farbe4) / 4;
</code></pre>
<p>Das funktioniert nicht <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="😃"
    /> . Aus 4 Weißen Pixeln wurde ein türkiser Pixel.</p>
<p>Dann habe ich hier im Forum eine Möglichkeit gefunden, die lange Uint32 in 4 Uint8 mit den einzelnen Daten zu zerlegen:</p>
<pre><code class="language-cpp">rot1 = farbe1 &amp; 0xff;
gruen1 = (farbe1 &gt;&gt; 8) &amp; 0xff;
blau1 = (farbe1 &gt;&gt; 16) &amp; 0xff;
alpha1 = (farbe1 &gt;&gt; 24) &amp; 0xff;
</code></pre>
<p>Was exakt das 0xff darin bewirkt, weiß ich nicht, es sorgt irgendwie dafür, dass egal auf welchem Computer die Uint32 immer von vorne gelesen wird. Ka, wie.</p>
<p>Dann habe ich versucht, die Farben folgendermaßen zu mischen (hier nur ein Ausschnitt):</p>
<p>Zwischenfarbe1 = SDL_MapRGB(arbeitsflaeche-&gt;format, (rot1+rot2)/2, (gruen1+gruen2)/2, (blau1+blau2)/2);</p>
<p>Aber dann erscheint gar nichts, oder eventuell schwarze oder transparente Pixel auf dem Bildschirm. Im Grunde mache ich ja auch den selben Fehler wie am Anfang, dass ich die Integer addiere und durch ihre Anzahl teile. Aber wie stelle ich denn den Mittelwert zweier Uint32 oder 8 fest?</p>
<p>So solls eigentlich sein:</p>
<pre><code class="language-cpp">Uint32 Farbe1 = 0xFFCC66FF;
Uint32 Farbe2 = 0xDDEE88BB;

//Irgendwas

Uint32 Mischfarbe = 0xEEDD77DD;
</code></pre>
<p>Ich denke, für die Leute, die C++ richtig können, ist das wahrscheinlich eine leichte Aufgabe. Aber für mich ist das echt schwer, weil ich einfach nicht weiß, wie das gehen soll. Genauso wenig, wie ich weiß, wie ich die Uint8 wieder zu einer Uint32 zusammenhänge. Ich hoffe jemand kann mir das erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242901/mittelwert-verschiedener-uint32-variablen-bilden</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 06:37:39 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242901.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Jun 2009 14:50:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Tue, 09 Jun 2009 14:51:38 GMT]]></title><description><![CDATA[<p>Da SDL_gfx momentan noch nicht bei mir läuft und auch einfach so zum basteln habe ich ein AntiAliasing in SDL programmiert. Meine Frage hat aber nichts mit SDL zu tun.</p>
<p>Funktionsweise:</p>
<p>Ich lese die RGBA Daten von vier aneinander liegenden Pixeln aus. z.B. Pixel 1 = 0xFF00FF00. Immer zwei Zeichen stehen für eine Information, also FF = Rotanteil, ... bis 00 = Alphawert.<br />
Nun will ich diese vier Pixel auf einen Pixel legen und muss dazu ja diese vier Uint32 &quot;mischen&quot;, also ihren Mittelwert bilden.</p>
<p>Das habe ich folgendermaßen versucht (wahrscheinlich greift ihr euch jetzt an den Kopf, aber ich weiß es nicht besser):</p>
<pre><code class="language-cpp">farbeDesNeuenPixels = (farbe1 + farbe2 + farbe3 + farbe4) / 4;
</code></pre>
<p>Das funktioniert nicht <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="😃"
    /> . Aus 4 Weißen Pixeln wurde ein türkiser Pixel.</p>
<p>Dann habe ich hier im Forum eine Möglichkeit gefunden, die lange Uint32 in 4 Uint8 mit den einzelnen Daten zu zerlegen:</p>
<pre><code class="language-cpp">rot1 = farbe1 &amp; 0xff;
gruen1 = (farbe1 &gt;&gt; 8) &amp; 0xff;
blau1 = (farbe1 &gt;&gt; 16) &amp; 0xff;
alpha1 = (farbe1 &gt;&gt; 24) &amp; 0xff;
</code></pre>
<p>Was exakt das 0xff darin bewirkt, weiß ich nicht, es sorgt irgendwie dafür, dass egal auf welchem Computer die Uint32 immer von vorne gelesen wird. Ka, wie.</p>
<p>Dann habe ich versucht, die Farben folgendermaßen zu mischen (hier nur ein Ausschnitt):</p>
<p>Zwischenfarbe1 = SDL_MapRGB(arbeitsflaeche-&gt;format, (rot1+rot2)/2, (gruen1+gruen2)/2, (blau1+blau2)/2);</p>
<p>Aber dann erscheint gar nichts, oder eventuell schwarze oder transparente Pixel auf dem Bildschirm. Im Grunde mache ich ja auch den selben Fehler wie am Anfang, dass ich die Integer addiere und durch ihre Anzahl teile. Aber wie stelle ich denn den Mittelwert zweier Uint32 oder 8 fest?</p>
<p>So solls eigentlich sein:</p>
<pre><code class="language-cpp">Uint32 Farbe1 = 0xFFCC66FF;
Uint32 Farbe2 = 0xDDEE88BB;

//Irgendwas

Uint32 Mischfarbe = 0xEEDD77DD;
</code></pre>
<p>Ich denke, für die Leute, die C++ richtig können, ist das wahrscheinlich eine leichte Aufgabe. Aber für mich ist das echt schwer, weil ich einfach nicht weiß, wie das gehen soll. Genauso wenig, wie ich weiß, wie ich die Uint8 wieder zu einer Uint32 zusammenhänge. Ich hoffe jemand kann mir das erklären.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723914</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Tue, 09 Jun 2009 14:51:38 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Tue, 09 Jun 2009 14:56:02 GMT]]></title><description><![CDATA[<p>Wenn du mehrere Integers addierst, kann es sein, dass du einen Überlauf kriegst. Deshalb solltest du mindestens einen Operanden vorher in einen grösseren Typen casten. Oder du führst zuerst die Division und dann die Addition durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723916</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723916</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Jun 2009 14:56:02 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Tue, 09 Jun 2009 15:25:00 GMT]]></title><description><![CDATA[<p>Fällt mir gerade so ein: Bei zwei Zahlen kann man auch</p>
<pre><code>Mittelwert(A,B) = (A+B)/2 = A - (A - B)/2
</code></pre>
<p>benutzen. Das ist zwar eine Adddition mehr, aber dafür spart man sich die eventuell Zeitraubende Verwendung eines größeren Types.</p>
<p>edit: Das kann man bestimmt auch verallgemeinern, aber ich habe gerade keine Lust zu rechnen, das Wetter ist so schlecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723936</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 09 Jun 2009 15:25:00 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Tue, 09 Jun 2009 16:07:54 GMT]]></title><description><![CDATA[<p>SeppJ, deine Idee ist an sich nicht schlecht, nur musst du bedenken, dass <code>A - B</code> unter Umständen zu einem Unterlauf führt. Nicht viel besser als ein Überlauf. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
<p>Von daher würde ich eher zu einem Cast raten ( <code>int</code> statt <code>char</code> sollte für die temporäre Aktion wohl drinliegen, ist wahrscheinlich auch am schnellsten). Mir fällt gerade ein, zuerst dividieren ist auch nicht gut, da man dadurch Informationen verliert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723960</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Jun 2009 16:07:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Tue, 09 Jun 2009 16:32:15 GMT]]></title><description><![CDATA[<p>Meinst du so etwas:</p>
<pre><code class="language-cpp">Uint32 Farbe1;
Uint32 Farbe2;
int Zwischenspeicher = Farbe1;
Uint32 Mischfarbe = (Zwischenspeicher + Farbe2)/2;
</code></pre>
<p>Funktioniert das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723972</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Tue, 09 Jun 2009 16:32:15 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Tue, 09 Jun 2009 16:45:54 GMT]]></title><description><![CDATA[<p>Uint32 entspricht doch normalerweise einem unsigned int. So gesehen macht das hier keinen Sinn int als Zwischenvariable zu nehmen.<br />
Hier ist es wirklich sinnvoll vorher zu dividieren. Etwa so:</p>
<pre><code class="language-cpp">Uint32 Farbe1;
Uint32 Farbe2;
Uint32 Mischfarbe = Farbe1 / 2.0 + Farbe2 / 2.0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1723980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723980</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 09 Jun 2009 16:45:54 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Tue, 09 Jun 2009 16:49:19 GMT]]></title><description><![CDATA[<p>Du willst doch den Durchschnitt der 8-Bit-Einzelfarben, und nicht des 32-Bit-Farbtyps, oder? Wieso dann nicht</p>
<pre><code class="language-cpp">Uint8 r1,g1,b1,a1; // deine 8-Bit-Werte der ersten Farbe
Uint8 r2,g2,b2,a2; // die der zweiten Farbe

// Misch-Einzelfarben in grösseren Typen (16 Bit reicht für Addition)
Uint16 rm = (r1 + r2) / 2;
Uint16 gm = (g1 + g2) / 2;
// analog b, a
</code></pre>
<p>Du musst ja nicht so viele Variablen anlegen, ich hab das hier der Einfachheit halber gemacht. Statt des <code>Uint16</code> könntest du einfach in einem Ausdruck casten, das hier war nur zur Verdeutlichung. Du kannst das auch auf 4 Farben ausdehnen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723981</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 09 Jun 2009 16:49:19 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Thu, 11 Jun 2009 15:02:33 GMT]]></title><description><![CDATA[<p>Aber wie bekomme ich die Uint16 dann wieder in eine Uint8 und die 4 RGBA Uint8 zu einer Uint32?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725087</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Thu, 11 Jun 2009 15:02:33 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Thu, 11 Jun 2009 15:17:26 GMT]]></title><description><![CDATA[<p>Little Programmer schrieb:</p>
<blockquote>
<p>Aber wie bekomme ich die Uint16 dann wieder in eine Uint8</p>
</blockquote>
<p>Durch einen ganz normalen Cast. Der zusätzliche Platz wird ja nur temporär gebraucht.</p>
<p>Little Programmer schrieb:</p>
<blockquote>
<p>und die 4 RGBA Uint8 zu einer Uint32?</p>
</blockquote>
<p>Zum Beispiel durch Bitshifts.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725095</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 11 Jun 2009 15:17:26 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Thu, 11 Jun 2009 16:54:17 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>SeppJ, deine Idee ist an sich nicht schlecht, nur musst du bedenken, dass <code>A - B</code> unter Umständen zu einem Unterlauf führt. Nicht viel besser als ein Überlauf. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>einfach die groessere zahl als 'A' nehmen:</p>
<pre><code class="language-cpp">if(A &gt; B)
    return A - (A-B)/2;
else
    return B - (B-A)/2;
</code></pre>
<p>mit mehr als zwei Zahlen ist diese Methode allerdings nicht mehr so gut, wegen zu grossem overhead.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725151</guid><dc:creator><![CDATA[Heinzelotto]]></dc:creator><pubDate>Thu, 11 Jun 2009 16:54:17 GMT</pubDate></item><item><title><![CDATA[Reply to Mittelwert verschiedener Uint32 Variablen bilden on Fri, 12 Jun 2009 13:41:45 GMT]]></title><description><![CDATA[<p>Und vor allem, da es hier um Pixel geht. Ich suche nach einer allgeminen Lösung für das Problem, aber z.B. schon das erste Programm, indem ich es anwenden will, zeichnet nur weiße Pixel auf schwarzen Hintergrund. Das bedeutet, alle schwarzen und alle weißen Pixel haben exakt die selben Werte. Auch bei anderen Programmen ist es mehr als wahrscheinlich, dass sich zwei nebeneinander liegende Pixel einen Farbwert teilen. Dann bräcuhe ich zwei ineinander verschachtelte If-Abfragen. Das ganze ist jetzt schon viel zu langsam, da es ja pixelweise den ganzen Bildschirm abtastet. Ich glaube mit den If-Abfragen reduziert sich das ganze dann auf ein neues Gesamtbild alle paar Sekunden.</p>
<p>Mit Bitshifts kenne ich mich zwar nciht aus, aber ich werd mich mal darüber schlau machen. Ich glaub' dieses Variablenumformungen sind die beste Idee.</p>
<p>Danke euch allen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1725592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1725592</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Fri, 12 Jun 2009 13:41:45 GMT</pubDate></item></channel></rss>