<?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[Pixel aus Bitmap auslesen]]></title><description><![CDATA[<p>Ich versuche, aus einem monochromen Bitmap einzelne Pixel auszulesen.<br />
Das Bitmap ist dabei kein &quot;echtes&quot; Bitmap, sondern ein &quot;PegBitmap&quot; (Bestandteil eines SDKs).</p>
<pre><code class="language-cpp">struct PegBitmap
{
    UCHAR uFlags;         // combination of flags listed below
    UCHAR uBitsPix;       // 1, 2, 4, or 8 NOTE: Only 1 is supported in the ClassPad
    WORD  wWidth;         // in pixels
    WORD  wHeight;        // in pixels
    DWORD dTransColor;    // transparent color for &gt;= 8bpp bitmaps
    UCHAR PEGFAR *pStart; // Pointer to bitmap data
};
</code></pre>
<p>Beim SDK liegt ein Programm bei, das mir normale Bitmaps in Code für PegBitmaps umwandelt. Der sieht bei einem 16x2px Bitmap dann z.B. so aus:</p>
<pre><code class="language-cpp">ROMDATA UCHAR uctestBitmap[4] = {
0x80,0x00,0x00,0x00,};
PegBitmap gbtestBitmap = { 0x00, 1, 16, 2, 0x000000ff, (UCHAR *) uctestBitmap};
</code></pre>
<p>Die Pixel werden anscheinend von oben links aus Zeilenweise eingelesen.</p>
<p>Mein Versuch, einzelne Pixel auszulesen, sieht so aus:</p>
<pre><code class="language-cpp">bool IsBlack(SIGNED x, SIGNED y, PegBitmap* pbmp)
{
    WORD width = pbmp-&gt;wWidth;
    WORD height = pbmp-&gt;wHeight;
    int bpl = (int)ceil(width/8.0);
    if(x&gt;0&amp;&amp;x&lt;width&amp;&amp;y&gt;0&amp;&amp;y&lt;height)
    {
        int ind = y*bpl+(int)ceil(x/8.0);
        if(pbmp-&gt;pStart[ind]&amp;(UINT)pow(2,8-(x/8.0-floor(x/8.0))*8.0)!=0)
              return true;
    }   
    return false; 
}
</code></pre>
<p>Leider funktioniert der nicht so, wie er sollte. An einigen Positionen wird zwar &quot;true&quot; zurückgegeben, aber nicht an den richtigen...</p>
<p>Sieht da jemand den Fehler? Oder ist das totaler Quatsch, was ich da mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/259757/pixel-aus-bitmap-auslesen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 18:09:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/259757.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 27 Jan 2010 12:32:08 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pixel aus Bitmap auslesen on Wed, 27 Jan 2010 12:32:08 GMT]]></title><description><![CDATA[<p>Ich versuche, aus einem monochromen Bitmap einzelne Pixel auszulesen.<br />
Das Bitmap ist dabei kein &quot;echtes&quot; Bitmap, sondern ein &quot;PegBitmap&quot; (Bestandteil eines SDKs).</p>
<pre><code class="language-cpp">struct PegBitmap
{
    UCHAR uFlags;         // combination of flags listed below
    UCHAR uBitsPix;       // 1, 2, 4, or 8 NOTE: Only 1 is supported in the ClassPad
    WORD  wWidth;         // in pixels
    WORD  wHeight;        // in pixels
    DWORD dTransColor;    // transparent color for &gt;= 8bpp bitmaps
    UCHAR PEGFAR *pStart; // Pointer to bitmap data
};
</code></pre>
<p>Beim SDK liegt ein Programm bei, das mir normale Bitmaps in Code für PegBitmaps umwandelt. Der sieht bei einem 16x2px Bitmap dann z.B. so aus:</p>
<pre><code class="language-cpp">ROMDATA UCHAR uctestBitmap[4] = {
0x80,0x00,0x00,0x00,};
PegBitmap gbtestBitmap = { 0x00, 1, 16, 2, 0x000000ff, (UCHAR *) uctestBitmap};
</code></pre>
<p>Die Pixel werden anscheinend von oben links aus Zeilenweise eingelesen.</p>
<p>Mein Versuch, einzelne Pixel auszulesen, sieht so aus:</p>
<pre><code class="language-cpp">bool IsBlack(SIGNED x, SIGNED y, PegBitmap* pbmp)
{
    WORD width = pbmp-&gt;wWidth;
    WORD height = pbmp-&gt;wHeight;
    int bpl = (int)ceil(width/8.0);
    if(x&gt;0&amp;&amp;x&lt;width&amp;&amp;y&gt;0&amp;&amp;y&lt;height)
    {
        int ind = y*bpl+(int)ceil(x/8.0);
        if(pbmp-&gt;pStart[ind]&amp;(UINT)pow(2,8-(x/8.0-floor(x/8.0))*8.0)!=0)
              return true;
    }   
    return false; 
}
</code></pre>
<p>Leider funktioniert der nicht so, wie er sollte. An einigen Positionen wird zwar &quot;true&quot; zurückgegeben, aber nicht an den richtigen...</p>
<p>Sieht da jemand den Fehler? Oder ist das totaler Quatsch, was ich da mache?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845676</guid><dc:creator><![CDATA[wolff]]></dc:creator><pubDate>Wed, 27 Jan 2010 12:32:08 GMT</pubDate></item><item><title><![CDATA[Reply to Pixel aus Bitmap auslesen on Wed, 27 Jan 2010 13:47:51 GMT]]></title><description><![CDATA[<p>Also zuerst einmal eine kleine Fehlerkorrektur:</p>
<pre><code class="language-cpp">if(x&gt;=0 &amp;&amp; x&lt;width &amp;&amp; y&gt;=0 &amp;&amp; y&lt;height)
</code></pre>
<p>Und für die Indexberechnung benötigt man auch keine float-Umrechnungen:</p>
<pre><code class="language-cpp">int bpl = width/8;
int ind = y*bpl+x/8;

return (pbmp-&gt;pStart[ind] &amp; (1 &lt;&lt; (7 - x%8))) != 0;
</code></pre>
<p>Die Berechnung ist jetzt ohne Garantie, aber die Herangehensweise ist so richtig...<br />
Beachte auch die Operatorprioritäten: bei (a &amp; b) != 0 !!!</p>
<p>Zu den Bitoperationen (&amp;, &lt;&lt;, etc. ) si. <a href="http://de.wikipedia.org/wiki/Bitweiser_Operator" rel="nofollow">http://de.wikipedia.org/wiki/Bitweiser_Operator</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845745</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845745</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 27 Jan 2010 13:47:51 GMT</pubDate></item><item><title><![CDATA[Reply to Pixel aus Bitmap auslesen on Wed, 27 Jan 2010 15:18:21 GMT]]></title><description><![CDATA[<p>Danke erstmal!</p>
<p>Das hat mir schon sehr weitergeholfen, eine Umrechnung brauche ich aber, da das Bild auch eine nicht durch 8 teilbare Breite haben kann.</p>
<p>So klappts:</p>
<pre><code class="language-cpp">bool IsBlack(SIGNED x, SIGNED y, PegBitmap* pbmp)
{
    WORD width = pbmp-&gt;wWidth;
    WORD height = pbmp-&gt;wHeight;
    if(x&gt;=0&amp;&amp;x&lt;width&amp;&amp;y&gt;=0&amp;&amp;y&lt;height)
    {
        int bpl = ceil(width/8.0);
        int ind = y*bpl+x/8;
        if((pbmp-&gt;pStart[ind]&amp;(1&lt;&lt;(7-x%8)))!=0)
              return true;
    }   
    return false; 
}
</code></pre>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845805</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845805</guid><dc:creator><![CDATA[wolff]]></dc:creator><pubDate>Wed, 27 Jan 2010 15:18:21 GMT</pubDate></item><item><title><![CDATA[Reply to Pixel aus Bitmap auslesen on Wed, 27 Jan 2010 16:08:01 GMT]]></title><description><![CDATA[<p>Dann nimm besser</p>
<pre><code class="language-cpp">int bpl = (width+7)/8;
</code></pre>
<p>int nach float und dann wieder zurück nach int ist unnötig!</p>
<p>Edit: hier noch ein Link auf wikipedia (<a href="http://de.wikipedia.org/wiki/IEEE_754" rel="nofollow">http://de.wikipedia.org/wiki/IEEE_754</a>) wo der Aufbau der Gleitkommatypen beschrieben ist (und warum die Umwandlung nach int nicht ganz trivial ist - auch wenn das der Mathe-Coprozessor übernimmt -)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1845837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1845837</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Wed, 27 Jan 2010 16:08:01 GMT</pubDate></item></channel></rss>