Entwickler-Ecke

Multimedia / Grafik - flimmerfreie Darstellung von Grafik in Paintbo/image


FatalError - Sa 20.12.03 16:14
Titel: flimmerfreie Darstellung von Grafik in Paintbo/image
Hi,

wenn in Image-Fenstern schnell hintereinander z.B über eine Timer-procedure immer neue Kreise od.Linien eingezeichnet werden, kommt es bei mir immer zu "flimmern" des images, d.h. man sieht z.B. auf schwarzem Himtergrund immer wieder kurz graue Streifen.

Wie kann man das verhindern?

Grüße
Andy :wink:

p.S.hat nichts mit besoffensein zu tun :lol:


Gandalfus - Sa 20.12.03 17:19

Backpuffer


FatalError - Sa 20.12.03 18:19

danke :D mal sehen ob ichs hinbekomme..


Andere Frage:

warum bekomme ich mit diesem Code(unten) automatisch einen weißen Hintergrund?
Wie kann ich den Rest des images (um den Kreis herum) durchsichtig erscheinen lassen?



Delphi-Quelltext
1:
2:
3:
4:
5:
begin with image1.canvas do
        begin
          Brush.Color:=clgreen;
          Ellipse(40,100,0,60);
        end;


Grüße
Andy


StefanH - Sa 20.12.03 18:25

wie wärs mit Image1.Transparent???


FatalError - Sa 20.12.03 19:21

Hi,

danke,genau was ich suchte aber nicht fand :D

Zum Backpuffer:

was genau macht diese Codezeile? Versteh ich irgendwie nicht :roll: Kann mir das jemand erklären?


Delphi-Quelltext
1:
BitBlt(backpuffer.canvas.handle,50,50,105,105,image1.Canvas.handle,0,0,srccopy);                    


Gruß
Andy


tommie-lie - Sa 20.12.03 20:48

FatalError hat folgendes geschrieben:
was genau macht diese Codezeile? Versteh ich irgendwie nicht :roll: Kann mir das jemand erklären?

Delphi-Quelltext
1:
BitBlt(backpuffer.canvas.handle,50,50,105,105,image1.Canvas.handle,0,0,srccopy);                    

Das ist eine Funktion aus der Windows-API. Sie kopiert (verhältnismäßig schnell) zwei Bilder ineinander (macht praktisch das, was Canvas.Draw() auch macht). Der erste Parameter ist das Handle des Zieles (der Backpuffer). Dann folgen X, Y Breite und Höhe und das Handle der Quelle (das Image). Dann kommen die X- und Y-Koordinaten des Fensters, daß aus der Quelle kopiert werden soll (wenn man nicht das ganze Bild kopieren will). Zum Schluß der Kopiermodes, in diesem Fall einfaches Überschreiben mit den Daten der Quelle.


Gandalfus - Sa 20.12.03 20:59

alles zeichnen erfolgt auf einem Hintegrund bild


Delphi-Quelltext
1:
2:
var 
  backpuffer: TBitmap


das bild muss noch erstellt werden:


Delphi-Quelltext
1:
2:
3:
backpuffer := TBitmap.create;
backpuffer.width := XXX; 
backpuffer.height := XXXX:


alle zeichen operationen erfolgen jetzt auf diesem backbild

z.B.: Backpuffer.canvas.pixels[10,10] :)= clred;

noch abschluss aller zeichen operationen wird das gesamte bild auf den BIldschirm(Formular) kopiert


Delphi-Quelltext
1:
BitBlt(Form1.canvas.handle,0 ,0 ,backpuffer.width ,backpuffer.height ,backpuffer.Canvas.handle,0,0,srccopy)                    


zum besseren verständnis der BitBlt Funktion:
BitBlt(Handle des Zieles,XPosition,YPosition,Breite,Höhe,Handle der Quelle,Position des Ausschnits der kopiert werden sollX,Y,Modus in dem kopiert wird{normal ist srccopy});


FatalError - Sa 20.12.03 23:15

Hi,

thks für die Erklärungen, klappt schon, das meiste...

zwei Fragen noch:

1. Wie kann man jedesmal auf einer neuen Grundlage zeichen(neues Canvas?)
Gibt es sowas wie Clrscr (clearscreen) in Pascal auch in Delphi?

2.wie kann man das mit Operationen (ellipse, rectangle, etc.) auf dem Canvas erzeugte Bild pixelweise abspeichern?
Ich will jeweils das letzte Bild als Backpuffer für das nächste nehmen...

Grüße
Andy :lol: