Announcement

Collapse
No announcement yet.

Pixel aktualisieren, ohne Flackern

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Pixel aktualisieren, ohne Flackern

    <html>

    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
    <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
    <meta name="ProgId" content="FrontPage.Editor.Document">
    <title>Neue Seite 1</title>
    </head>

    <body>

    <p>Hallo, Ich hab hier ein Bitmap in einem TImage angezeigt. Das Bitmap muß pixelweise untersucht und bearbeitet werden, das
    dauert natürlich ziemlich lange. Um anzuzeigen, wie weit das Programm gerade ist, möchte ich die Pixel einfärben und
    den Bildschirm aktualisieren. Klar: dann dauert das Ganze noch ein wenig länger, das spielt aber keine Rolle. Die Eigenschaft
    IncrementalDisplay hab ich vor der Schleife auf true gesetzt, muß aber trotzdem Form->Update(); aufrufen. Und nun flackert es wie
    verrückt, weil er das ganze Bild neu aufbaut. Wie krieg ich die VCL dazu, nur den soeben geänderten Teil des Bildes zu aktualisieren?</p>
    <p>Danke, und einen schönen Sonntag noch...&nbsp;&nbsp;&nbsp;</p>
    <p>Günther</p>
    <pre>&nbsp;</pre>
    <pre>void __fastcall TImageForm::SpeedButton3Click(TObject *Sender)
    {
    Image1-&gt;IncrementalDisplay=true;
    for(int y=0; y&lt;Image1->Height; y++)
    {
    for(int x=0; x&lt;Image1->Width; x++)
    {
    int dummy=1;
    switch(Image1-&gt;Canvas-&gt;Pixels[x][y])
    {
    case clBlack:for(int xx=-1; xx&lt;2; xx++)
    for(int yy=-1; yy&lt;2; yy++)
    {
    if((Image1-&gt;Canvas-&gt;Pixels[x+xx][y+yy]==clWhite)
    |(Image1-&gt;Canvas-&gt;Pixels[x+xx][y+yy]==clYellow))
    {
    dummy=0;
    break;
    }
    }
    if(dummy==1) Image1->Canvas->Pixels[x][y]=clRed;
    break;
    case clWhite:Image1-&gt;Canvas-&gt;Pixels[x][y]=clYellow;
    break;
    }
    }
    ImageForm-&gt;Update();
    }
    for(int y=0; y&lt;Image1->Height; y++)
    {
    for(int x=0; x&lt;Image1->Width; x++)
    {
    switch(Image1-&gt;Canvas-&gt;Pixels[x][y])
    {
    case clRed:
    case clYellow:Image1->Canvas->Pixels[x][y]=clWhite;
    break;
    }
    }
    ImageForm-&gt;Update();
    }
    Image1-&gt;IncrementalDisplay=false;
    }</pre>

    </body>

    </html>
    Günther

  • #2
    Was passiert bei

    Image1->Repaint();

    oder

    Image1->Update();

    statt ImageForm->Update()
    Christian

    Comment


    • #3
      Da flackert es genauso
      Günther

      Comment


      • #4
        <html>

        <head>
        <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
        <meta name="GENERATOR" content="Microsoft FrontPage 4.0">
        <meta name="ProgId" content="FrontPage.Editor.Document">
        <title>Neue Seite 1</title>
        </head>

        <body>

        <p>Die Methode Repaint veranlaßt das Steuerelement, sich selbst erneut zu zeichnen.&nbsp;<br>
        <br>
        virtual void __fastcall Repaint(void);<br>
        <br>
        Beschreibung<br>
        <br>
        Durch einen Aufruf von Repaint wird das Steuerelement veranlaßt, sich sofort erneut zu zeichnen. Wenn die Eigenschaft ControlStyle den Wert csOpaque enthält, zeichnet sich das Steuerelement direkt selbst. Andernfalls ruft Repaint zunächst Invalidate und danach Update auf, damit auch alle sichtbaren Bereiche der Komponenten unter dem Steuerelement erneut gezeichnet werden.</p>
        <p>&nbsp;</p>
        <p> Image1->ControlStyle&lt;&lt;csOpaque;</p>
        <p>Image1->Repaint();</p>
        <p>&nbsp;</p>
        <p>...und trotzdem flackert er... (bei Invalidate wird ja der Bildschirmbereich zuerst gelöscht, was zum Flackern führt)</p>
        <p>&nbsp;</p>

        </body>

        </html&gt
        Günther

        Comment


        • #5
          Versuch doch mal, DoubleBuffered auf true zu setzen.
          (Wenn TImage diese Eigenschaft nicht hat - weiß ich
          grad nicht auswendig -, leg ein Panel unter das
          Image.)
          <p>Uli

          Comment


          • #6
            Panel1->DoubleBuffered=true;

            Das war genau das, was ich brauche. Danke Ulrich, (Christian natürlich auch)
            Günther

            Comment


            • #7
              Hallo Günther,

              eventuell läßt sich die Verarbeitung deutlich beschleunigen, wenn Du das Bitmap nicht pixelweise, sondern zeilenweise über die Scanline ausliest. Ich mußte mal Bitmaps um 90°, 180° oder 270° rotieren. Mit dem Zugriff über Scanline geht das Ganze ca. 10 mal schneller, als über den Pixelzugriff...

              Grüße Joche

              Comment


              • #8
                Das werd ich ausprobieren
                Günther

                Comment

                Working...
                X