<?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[schneller Zugriff auf Bild]]></title><description><![CDATA[<p>Ich mache das bisher so:</p>
<p>Ich lade ein Bild von der Festplatte in ein TImage und mache dann was mit dem Image.</p>
<p>Z.B.</p>
<pre><code class="language-cpp">for (int x = 0; x &lt; Image1-&gt;Width; x++)
      for (int y = 0; y &lt; Image1-&gt;Height; y++)
         Image1-&gt;Canvas-&gt;Pixels[x][y]++;
</code></pre>
<p>Das dauert aber extrem lange!</p>
<p>Wie geht das schneller?</p>
<p>Vielen Dank &amp; Liebe Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192321/schneller-zugriff-auf-bild</link><generator>RSS for Node</generator><lastBuildDate>Mon, 17 Aug 2026 21:26:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192321.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 12 Sep 2007 21:40:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Wed, 12 Sep 2007 21:40:44 GMT]]></title><description><![CDATA[<p>Ich mache das bisher so:</p>
<p>Ich lade ein Bild von der Festplatte in ein TImage und mache dann was mit dem Image.</p>
<p>Z.B.</p>
<pre><code class="language-cpp">for (int x = 0; x &lt; Image1-&gt;Width; x++)
      for (int y = 0; y &lt; Image1-&gt;Height; y++)
         Image1-&gt;Canvas-&gt;Pixels[x][y]++;
</code></pre>
<p>Das dauert aber extrem lange!</p>
<p>Wie geht das schneller?</p>
<p>Vielen Dank &amp; Liebe Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364326</guid><dc:creator><![CDATA[Thoms]]></dc:creator><pubDate>Wed, 12 Sep 2007 21:40:44 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Wed, 12 Sep 2007 21:42:32 GMT]]></title><description><![CDATA[<p>TBitmap::ScanLine</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364328</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Wed, 12 Sep 2007 21:42:32 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 12:35:59 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Antwort ... damit kann man schnell zeichnen ...</p>
<p>aber wie kann ich folgendes machen?</p>
<p>Ich habe ein Image und möchte ein neues Image erstellen ...</p>
<p>Dabei soll jeder Pixel im neuen Bild aus den Pixel vom originalbild und den 8 Pixeln die um den zu bearbeiten Pixel liegen zusammen setzten ... es soll also ein durchschnitt der ach Pixel gebildet werden.</p>
<p>Vielen Dank &amp; Liebe Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364629</guid><dc:creator><![CDATA[Thoms]]></dc:creator><pubDate>Thu, 13 Sep 2007 12:35:59 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 16:35:08 GMT]]></title><description><![CDATA[<p>Das ist doch eine einfache Mathematik-Frage, was hat das mit dem BCB zu tun!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364773</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364773</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Thu, 13 Sep 2007 16:35:08 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 17:39:35 GMT]]></title><description><![CDATA[<p>Ich lade das Bild aus einem TImage == CBuilder</p>
<p>gibt es noch eine schnellere Möglichkeit als TBitmap::ScanLine?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364816</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364816</guid><dc:creator><![CDATA[Thoms]]></dc:creator><pubDate>Thu, 13 Sep 2007 17:39:35 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 18:28:57 GMT]]></title><description><![CDATA[<p>Kann es sein, dass das nur mit bestimmten Datentypen richtig funktioniert ... benutze ich ein s/w Bild als ausgangsbild funktioniert alles wunderbar ... hingegen bei einem farbbild wird nur das 1. viertel bearbeitet ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364845</guid><dc:creator><![CDATA[Thoms]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 18:32:42 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Thoms schrieb:</p>
<blockquote>
<p>gibt es noch eine schnellere Möglichkeit als TBitmap::ScanLine?</p>
</blockquote>
<p>Möglicherweise mit WinAPI anstelle von TBitmap.</p>
<blockquote>
<p>Kann es sein, dass das nur mit bestimmten Datentypen richtig funktioniert ... benutze ich ein s/w Bild als ausgangsbild funktioniert alles wunderbar ... hingegen bei einem farbbild wird nur das 1. viertel bearbeitet ...</p>
</blockquote>
<p>Die Anwort ist ganz klar : dein Code ist fehlerhaft.<br />
(Und ich hoffe du verstehst die Anspielung)</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364850</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:32:42 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 18:41:24 GMT]]></title><description><![CDATA[<p>Ein SW-Bild (oder allgemein 8 bit, 256 Graustufen/Farben) hat 1 Byte pro Pixel, ein Farbbild (32bit, 16.7 Mio Farben) eben 4 Byte pro Pixel.</p>
<p>ScanLine ist die schnellste Variante, die die VCL bietet. Ob die WinAPI (BitBlt o.ä.) da mehr leistet kann ich nicht sagen, das wäre vielleicht eine Frage für's Spiele/Grafik-Forum hier. Bei Bedarf verschiebe ich dich gern dorthin.</p>
<p>/Edit: getrödelt ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364856</guid><dc:creator><![CDATA[Jansen]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:41:24 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 18:56:42 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Die Anwort ist ganz klar : dein Code ist fehlerhaft.<br />
(Und ich hoffe du verstehst die Anspielung)</p>
</blockquote>
<p>Beziehst du dich auf den Code?</p>
<pre><code class="language-cpp">for (int x = 0; x &lt; Image1-&gt;Width; x++)
      for (int y = 0; y &lt; Image1-&gt;Height; y++)
         Image1-&gt;Canvas-&gt;Pixels[x][y]++;
</code></pre>
<p>Dass der nicht geht is mir auch klar ... leider habe ichs nur zu spät gemerkt ... ich habe gedacht man versteht meine Zielstellung trotzdem ...</p>
<p>Möglicherweise wäre ich tatsächlich in einem anderem Forum besser aufgehoben aber ob nu das WinAPI oder spiele/grafik weiß ich nicht so recht ... mit BCB hat mein Problem nicht viel zu tun!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364866</guid><dc:creator><![CDATA[Thoms]]></dc:creator><pubDate>Thu, 13 Sep 2007 18:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Thu, 13 Sep 2007 19:10:24 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Ja ich meinte den Code... das du den hier mal posten sollst. Und zwar allen relevanten und nur den.<br />
Ich glaube das Jansen recht hat mit der Farbtiefe. Bei einem Grau-Bild liest du pro Piexel 1 Byte. Bei einem 32-bit Bild must du aber 4 byte pro Pixel lesen. Machst du das nicht bearbeitest du in der Tat nur 1/4 des Bildes (Auf Scanline bezogen... bei Zugriff über Pixels[][] sollte das nicht auftreten).</p>
<blockquote>
<p>Möglicherweise wäre ich tatsächlich in einem anderem Forum besser aufgehoben aber ob nu das WinAPI oder spiele/grafik weiß ich nicht so recht ...</p>
</blockquote>
<p>Je nachdem ob du beim reinen Betriebssystem bleiben willst (WinAPI) und auf Basis von reinem C alles selber optimieren willst oder mit extra Bibliotheken (DirectX...) arbeiten und die eventuell schon vorhandenen optimierten Sturkturen benutzen willst.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1364880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1364880</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Thu, 13 Sep 2007 19:10:24 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Fri, 14 Sep 2007 16:50:32 GMT]]></title><description><![CDATA[<p>akari schrieb:</p>
<blockquote>
<p>Ich glaube das Jansen recht hat mit der Farbtiefe. Bei einem Grau-Bild liest du pro Piexel 1 Byte. Bei einem 32-bit Bild must du aber 4 byte pro Pixel lesen. Machst du das nicht bearbeitest du in der Tat nur 1/4 des Bildes (Auf Scanline bezogen... bei Zugriff über Pixels[][] sollte das nicht auftreten).</p>
</blockquote>
<p>Pixels[][] funktioniert auch prima ... lediglich der hohe Zeitfaktor ist der Grund, warum diese Möglichkeit ausscheidet.</p>
<p>Hier mal mein Code:</p>
<pre><code class="language-cpp">Graphics::TBitmap *pOriginalBitmap = new Graphics::TBitmap();
   Graphics::TBitmap *pNewBitmap = new Graphics::TBitmap();
   Byte *ptrOriginal;
   Byte *ptrNew;

   pOriginalBitmap-&gt;Assign(Image1-&gt;Picture);
   pNewBitmap-&gt;Assign(Image1-&gt;Picture);

   DWORD t = ::timeGetTime();

   try
   {
      for (int y = 0; y &lt; pOriginalBitmap-&gt;Height; y++)
      {
         ptrOriginal = (Byte *)pOriginalBitmap-&gt;ScanLine[y];
         ptrNew = (Byte *)pNewBitmap-&gt;ScanLine[y];
         for (int x = 0; x &lt; pOriginalBitmap-&gt;Width; x++)
            ptrNew[x] = 0xFFFFFF-(Byte)ptrNew[x];
      }
   }
   catch (...)
   {
     ShowMessage(&quot;Bitmap konnte nicht geladen oder geändert werden!&quot;);
   }
   Form1-&gt;Caption = (::timeGetTime() - t) / 1000.0;
   Form1-&gt;Caption = Form1-&gt;Caption + &quot; &quot; + IntToStr(pNewBitmap-&gt;PixelFormat);
   Image2-&gt;Canvas-&gt;Draw(0,0,pNewBitmap);

   delete pNewBitmap;
   delete pOriginalBitmap;
</code></pre>
<p>Liebe Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365409</guid><dc:creator><![CDATA[Thoms]]></dc:creator><pubDate>Fri, 14 Sep 2007 16:50:32 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Fri, 14 Sep 2007 17:01:37 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Genau das Problem das Jansen angesprochen hat, in dieser Schleife</p>
<pre><code class="language-cpp">for (int x = 0; x &lt; pOriginalBitmap-&gt;Width; x++)
  ptrNew[x] = 0xFFFFFF-(Byte)ptrNew[x];
</code></pre>
<p>Und selbt die Behandlung von einem Byte ist unsauber. 0xFFFFFF entspricht 4 (es gibt keine 3 Byte-Datentypen) Bytes, und du ziehst davon eine Zahl der Breite 1 Byte ab. Daraus wird natürlich eine 4 Byte Zahl, die erst wieder zurückgecastet werden muß wenn es wieder ins Array zurückgeschrieben wird (zu deinem Glück werden dazu ddas 'unterste' Byte genommen, deshalb merkst du davon nichts)<br />
1 Byte reicht aber gerade mal für 255 Werte.. und entspricht damit genau einem Farbkanel bzw. Schwarz-Weiß. Wenn du also nun ein Bild mit 32-bit Farbtiefe (3 Farbkanäle + 1 Alpha/Müll) einliest kann das gar nicht richtig funktionieren. Den nun hast du durch Scanline ein Array bekommen das <strong>pro Pixel 4 Bytes beinhaltet</strong>. Da du aber trotzdem nur 1 Byte pro Pixel liest bearbeitet deine Funktion grade mal 1/4 der Bildbreite.<br />
Also must du erstmal aus der Eigenschaft <em>TBitmap::PixelFormat</em> auslesen wieviel Bytes pro Pixel verwendet werden. Dann must du darauf hin die Ausleseschleife anpassen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365424</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365424</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Fri, 14 Sep 2007 17:01:37 GMT</pubDate></item><item><title><![CDATA[Reply to schneller Zugriff auf Bild on Fri, 14 Sep 2007 19:37:41 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Erklärung ... das habe ich verstanden <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>Ich habe den Code jetzt so abgeändert:</p>
<pre><code class="language-cpp">class CMaske
{
   public:
      int x;
      int y;

      float **data;

      CMaske(TStringGrid *StringGrid) : x(StringGrid-&gt;ColCount), y(StringGrid-&gt;RowCount)
      {
         data = new float*[x];
         for (int i = 0; i &lt; x; i++)
            data[i] = new float[y];

         for (int i = 0; i &lt; x; i++)
            for (int j = 0; j &lt; y; j++)
               data[i][j] = StrToFloat(StringGrid-&gt;Cells[i][j]);
      }

      ~CMaske()
      {
         for (int i = 0; i &lt; x;  i++)
            delete[] data[i];

         delete[] data;
      }
};
#include &quot;mmsystem.h&quot;
void __fastcall TForm1::Button2Click(TObject *Sender)
{

   bool negatig = CheckBox1-&gt;Checked;

   CMaske maske(StringGrid1);

   Graphics::TBitmap *pOriginalBitmap = new Graphics::TBitmap();
   Graphics::TBitmap *pNeuBitmap = new Graphics::TBitmap();

   RGBTRIPLE *ptrOriginal;
   RGBTRIPLE *ptrNeu;

   Graphics::TBitmap* BildQuelle;
   Graphics::TBitmap* BildZiel;

   pOriginalBitmap-&gt;Assign(Image1-&gt;Picture);

   pNeuBitmap-&gt;PixelFormat   = pOriginalBitmap-&gt;PixelFormat;
   pNeuBitmap-&gt;Palette       = pOriginalBitmap-&gt;Palette;
   pNeuBitmap-&gt;Height        = pOriginalBitmap-&gt;Height;
   pNeuBitmap-&gt;Width         = pOriginalBitmap-&gt;Width;

   int rcolor;
   int gcolor;
   int bcolor;

   DWORD t = ::timeGetTime();
   try
   {
      for (int y = 0; y &lt; pOriginalBitmap-&gt;Height; y++)
      {
         ptrOriginal = static_cast&lt;RGBTRIPLE*&gt;(pOriginalBitmap-&gt;ScanLine[y]);
         ptrNeu = static_cast&lt;RGBTRIPLE*&gt;(pNeuBitmap-&gt;ScanLine[y]);

         for (int x = 0; x &lt; pOriginalBitmap-&gt;Width; x++)
         {
            unsigned char rcolor = 0;
            unsigned char gcolor = 0;
            unsigned char bcolor = 0;

            for (int a = 0; a &lt; maske.x; a++)
               for (int b = 0; b &lt; maske.y; b++)
                  if (x - maske.x/2 &gt;= 0 &amp;&amp; x + maske.x/2 &lt; pOriginalBitmap-&gt;Width &amp;&amp;
                      y - maske.y/2 &gt;= 0 &amp;&amp; y + maske.y/2 &lt; pOriginalBitmap-&gt;Height)
                  {
                     RGBTRIPLE *ptrHilfe = static_cast&lt;RGBTRIPLE*&gt;(pOriginalBitmap-&gt;ScanLine[y - maske.y/2 + b]);
                     rcolor += ptrHilfe[x - maske.x/2 + a].rgbtBlue  * maske.data[a][b];
                     gcolor += ptrHilfe[x - maske.x/2 + a].rgbtGreen * maske.data[a][b];
                     bcolor += ptrHilfe[x - maske.x/2 + a].rgbtRed   * maske.data[a][b];
                  }

            ptrNeu[x].rgbtBlue  = rcolor;
            ptrNeu[x].rgbtGreen = gcolor;
            ptrNeu[x].rgbtRed   = bcolor;
         }
      }
   }
   catch (...)
   {
     ShowMessage(&quot;Bitmap konnte nicht geladen oder geändert werden!&quot;);
   }
   Form1-&gt;Caption = (::timeGetTime() - t) / 1000.0;

   Image2-&gt;Canvas-&gt;Draw(0,0,pNeuBitmap);

   delete pNeuBitmap;
   delete pOriginalBitmap;
}
</code></pre>
<p>.. aber das dauert so verdammt lange, dass es z.b. für Videos in Echtzeit ungeeignet ist...</p>
<p>Gibt es also noch eine Möglichkeit, die schneller ist?</p>
<p>Liebe Grüße!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365539</guid><dc:creator><![CDATA[Thoms]]></dc:creator><pubDate>Fri, 14 Sep 2007 19:37:41 GMT</pubDate></item></channel></rss>