Fragen zur Farbgebung von Pixeln
Fragen zur Farbgebung von Pixeln
Hallo,
ich habe ein paar Fragen zur Farbgebung von Pixeln in Lazarus.
1) Durch den Befehl "Form1.Canvas.Pixels[x,y]:=$000000;" kann ich einem Pixel die Farbe schwarz geben. Wenn ich die Form jedoch minimiere und dann wieder aktiviere, ist der Pixel wieder in der Standardfarbe. Wie kann man einem Pixel eine Farbe dauerhaft geben, sodass sie durch minimieren und aktivieren nicht wieder verschwindet?
2) Wie kann man die Farbe von Pixeln abhängig von Formeln/Berechnungen machen? In Pascal wird das ja durch die Befehle "setRGBPalette(Farbnummer,Rotstärke,Grünstärke,Blaustärke); PutPixel(x,y,Farbnummer);" ermöglicht. Gibt es eine entsprechende Möglichkeit in Lazarus?
ich habe ein paar Fragen zur Farbgebung von Pixeln in Lazarus.
1) Durch den Befehl "Form1.Canvas.Pixels[x,y]:=$000000;" kann ich einem Pixel die Farbe schwarz geben. Wenn ich die Form jedoch minimiere und dann wieder aktiviere, ist der Pixel wieder in der Standardfarbe. Wie kann man einem Pixel eine Farbe dauerhaft geben, sodass sie durch minimieren und aktivieren nicht wieder verschwindet?
2) Wie kann man die Farbe von Pixeln abhängig von Formeln/Berechnungen machen? In Pascal wird das ja durch die Befehle "setRGBPalette(Farbnummer,Rotstärke,Grünstärke,Blaustärke); PutPixel(x,y,Farbnummer);" ermöglicht. Gibt es eine entsprechende Möglichkeit in Lazarus?
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Fragen zur Farbgebung von Pixeln
Form1.Canvas ist ein TCanvas-Objekt. TCanvas implementiert ein Zeichenobjekt des jeweiligen Widgetsets (Win32, GTK, GTK2, Qt, Carbon). Mit Form1.Canvas kannst du nun auf die Zeichenfläche deines Formulars zugreifen und dort zeichnen (oder eben einzelne Pixel einfärben). Das Problem ist, dass die gesamte Zeichenoberfläche regelmäßig oder auf Anforderung (weil ein anderes Fenster über deins hinweg bewegt wurde) neu gezeichnet wird. Deine gemachten Änderungen werden einfach übermalt.400kmh hat geschrieben:1) Durch den Befehl "Form1.Canvas.Pixels[x,y]:=$000000;" kann ich einem Pixel die Farbe schwarz geben. Wenn ich die Form jedoch minimiere und dann wieder aktiviere, ist der Pixel wieder in der Standardfarbe. Wie kann man einem Pixel eine Farbe dauerhaft geben, sodass sie durch minimieren und aktivieren nicht wieder verschwindet?
Damit diese dauerhaft bleiben, musst du sie also immer neu zeichnen. Das kannst du entweder im OnPaint-Ereignis deines Formulars tun oder du benutzt ein TImage-Objekt. Diese speichert deine Änderungen in einem Bild zwischen und kopiert dieses dann auf seine eigene Zeichenoberfläche.
Möchtest du eine mathematische Funktion zeichnen? Davon habe ich leider keine Ahnung, aber du könntest dein Glück mit dem "Funktion plotten" bei google versuchen.400kmh hat geschrieben:2) Wie kann man die Farbe von Pixeln abhängig von Formeln/Berechnungen machen? In Pascal wird das ja durch die Befehle "setRGBPalette(Farbnummer,Rotstärke,Grünstärke,Blaustärke); PutPixel(x,y,Farbnummer);" ermöglicht. Gibt es eine entsprechende Möglichkeit in Lazarus?
Die Funktionen, die du aufführst sehen mir eher danach aus, ob man ein Bild mit indizierten Farben bearbeitetest. Inwiefern das von der LCL unterstützt wird, weiß ich nicht; aber zum Zeichnen mit Lazarus kennen sich hier andere eh besser aus als ich.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Fragen zur Farbgebung von Pixeln
1. Zeichne im OnPaint Ereignis oder auf ein TImage Bitmap.
2. z.B. mit function RGBToColor(R, G, B: Byte): TColor;
2. z.B. mit function RGBToColor(R, G, B: Byte): TColor;
-
- Lazarusforum e. V.
- Beiträge: 2808
- Registriert: Fr 22. Sep 2006, 10:38
- OS, Lazarus, FPC: Lazarus v2.0.10, FPC 3.2.0
- Wohnort: Hessen
- Kontaktdaten:
Re: Fragen zur Farbgebung von Pixeln
Hallo 400km/h!
Zunächst: Wenn Du Einsteiger bist, vergiss alle Ratschläge mit dem OnPaint-Ereignis.
Pixel, die auf die Canvas einer TImage gesetzt werden, sind dauerhaft. In der Objektleiste findest Du dabei unter "Additionals" das Objekt TImage. Davon einfach eins auf die Form ziehen. Dieses Image bildet nun Dein Zeichenbereich - alle Zeichnungen, die Du auf die Canvas der Image machst, sind dauerhaft.
Beispiel: Wenn das OnClick-Ereignis auf die Tmage wie folgt aussieht:
... dann bleibt das gezeichnete Muster erhalten - egal, ob Du die Form verschiebst, den Desktop wechselst oder minimierst/maximierst.
- Durch RGBToColor kannst Du die Farben mischen, siehe hier: http://www.lazarusforum.de/portal.php?c ... &query=rgb" onclick="window.open(this.href);return false;
- Auf diese Weise lassen sich einzelne Pixel der Canvas beispielsweise so einfärben: Image1.Canvas.Pixels[x,y]:=RGBToColor(rot,gruen,blau);
So. Ich hoffe, das hilft weiter...
Viele Grüße, Euklid
Zunächst: Wenn Du Einsteiger bist, vergiss alle Ratschläge mit dem OnPaint-Ereignis.

Diese Frage taucht immer wieder auf - und ist schnell beantwortet:400kmh hat geschrieben:1) Durch den Befehl "Form1.Canvas.Pixels[x,y]:=$000000;" kann ich einem Pixel die Farbe schwarz geben. Wenn ich die Form jedoch minimiere und dann wieder aktiviere, ist der Pixel wieder in der Standardfarbe. Wie kann man einem Pixel eine Farbe dauerhaft geben, sodass sie durch minimieren und aktivieren nicht wieder verschwindet?
Pixel, die auf die Canvas einer TImage gesetzt werden, sind dauerhaft. In der Objektleiste findest Du dabei unter "Additionals" das Objekt TImage. Davon einfach eins auf die Form ziehen. Dieses Image bildet nun Dein Zeichenbereich - alle Zeichnungen, die Du auf die Canvas der Image machst, sind dauerhaft.
Beispiel: Wenn das OnClick-Ereignis auf die Tmage wie folgt aussieht:
Code: Alles auswählen
procedure TForm1.Image1Click(Sender: TObject);
var x,y:word;
begin
// Draws the backgroung
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
// Draws squares
Image1.Canvas.Pen.Color := clBlack;
for x := 1 to 8 do
for y := 1 to 8 do
Image1.Canvas.Rectangle(Round((x - 1) * Image1.Width / 8), Round((y - 1) * Image1.Height / 8),
Round(x * Image1.Width / 8), Round(y * Image1.Height / 8));
end;
Solche Befehle gibt es auch bei Lazarus:Wie kann man die Farbe von Pixeln abhängig von Formeln/Berechnungen machen? In Pascal wird das ja durch die Befehle "setRGBPalette(Farbnummer,Rotstärke,Grünstärke,Blaustärke); PutPixel(x,y,Farbnummer);" ermöglicht. Gibt es eine entsprechende Möglichkeit in Lazarus?
- Durch RGBToColor kannst Du die Farben mischen, siehe hier: http://www.lazarusforum.de/portal.php?c ... &query=rgb" onclick="window.open(this.href);return false;
- Auf diese Weise lassen sich einzelne Pixel der Canvas beispielsweise so einfärben: Image1.Canvas.Pixels[x,y]:=RGBToColor(rot,gruen,blau);
So. Ich hoffe, das hilft weiter...
Viele Grüße, Euklid
Re: Fragen zur Farbgebung von Pixeln
Danke für die Antworten.
Nein, ich möchte den Pixeln bloß, anstatt ihnen ganz bestimmte von mir selbst zu berechnende Farben zuzuweisen, vorschreiben wie diese zu berechnen sind, sodass ich mir das Rechnen spare. Sollte mit RGBtoColor(x,y,z) möglich sein.Socke hat geschrieben:Möchtest du eine mathematische Funktion zeichnen?
Was ist denn der Nachteil des OnPaint-Ereignis (für Einsteiger)?Euklid hat geschrieben:Zunächst: Wenn Du Einsteiger bist, vergiss alle Ratschläge mit dem OnPaint-Ereignis.
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Fragen zur Farbgebung von Pixeln
Das OnPaint-Ereignis wird im normalen Betrieb sehr häufig aufgerufen. Wenn diese Funktion nicht in einer entsprechend kurzen Zeit abgearbeitet wird, sieht es so aus, als ob dein Programm kurz hängen geblieben ist. Als Anfänger kann man das aber kaum erreichen.400kmh hat geschrieben:Was ist denn der Nachteil des OnPaint-Ereignis (für Einsteiger)?Euklid hat geschrieben:Zunächst: Wenn Du Einsteiger bist, vergiss alle Ratschläge mit dem OnPaint-Ereignis.
Der andere Gedanke ist: TImage funktioniert und ist einfacher zu verwenden. Mit dem OnPaint-Ereignis muss man ein wenig tiefer in das Zeichnen von Komponenten und Steuerelementen einsteigen (wenn du nicht weißt, was das ist, musst du dir darüber auch keine Gedanken machen).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Re: Fragen zur Farbgebung von Pixeln
@Euklid: Der Code:
// Draws the backgroung
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
Ist nicht ganz richtig und im vorliegenden Fall auch überflüssig.
Richtig wäre: Image1.Canvas.Brush.Color := clWhite;
Da aber das Bild sowieso von Rectangles gefüllt wird, ist die Aktion eig. unnötig.
Und noch das: Wenn viele Pixels mit der Methode Canvas.Pixels gezeichnet werden müssen, wird's sehr langsam.
Da sollte man sich vllt. nach schnelleren Lösungen wie TLazIntfImage umsehen.
S.a. http://wiki.lazarus.freepascal.org/Deve ... raphics/de" onclick="window.open(this.href);return false;
// Draws the backgroung
Image1.Canvas.Pen.Color := clWhite;
Image1.Canvas.Rectangle(0, 0, Image1.Width, Image1.Height);
Ist nicht ganz richtig und im vorliegenden Fall auch überflüssig.
Richtig wäre: Image1.Canvas.Brush.Color := clWhite;
Da aber das Bild sowieso von Rectangles gefüllt wird, ist die Aktion eig. unnötig.
Und noch das: Wenn viele Pixels mit der Methode Canvas.Pixels gezeichnet werden müssen, wird's sehr langsam.
Da sollte man sich vllt. nach schnelleren Lösungen wie TLazIntfImage umsehen.
S.a. http://wiki.lazarus.freepascal.org/Deve ... raphics/de" onclick="window.open(this.href);return false;
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Fragen zur Farbgebung von Pixeln
Nein Theo ist er nicht. Weißt du was Euklid damit erreichen möchte ? Das bei der nächsten Zeichnung alles wieder Weg ist. Darum hat er auch Pen.Color gesetzt und nicht Brush.Color der ist als Standard immer clWhite beim Image.
Praktischer wäre jedoch die Methode FillRect Gewesen. Z.B. kann man so auch den Hintergrund Ändern.
Praktischer wäre jedoch die Methode FillRect Gewesen. Z.B. kann man so auch den Hintergrund Ändern.
Und wer soll sich damit auskennen ? Ich habe hier kaum jemand getroffen der sich damit wirklich auskennt. Außer dir.Und noch das: Wenn viele Pixels mit der Methode Canvas.Pixels gezeichnet werden müssen, wird's sehr langsam.
Da sollte man sich vllt. nach schnelleren Lösungen wie TLazIntfImage umsehen.
MFG
Michael Springwald
Michael Springwald
Re: Fragen zur Farbgebung von Pixeln
Du hast recht. Ist etwas verwirrend. Brush.Color/FillRect wäre klarer, aber hier auch überflüssig.pluto hat geschrieben:Darum hat er auch Pen.Color gesetzt und nicht Brush.Color der ist als Standard immer clWhite beim Image.
Praktischer wäre jedoch die Methode FillRect Gewesen. Z.B. kann man so auch den Hintergrund Ändern.
Was verstehst du daran nicht?pluto hat geschrieben: Und wer soll sich damit auskennen ? Ich habe hier kaum jemand getroffen der sich damit wirklich auskennt. Außer dir.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Fragen zur Farbgebung von Pixeln
Ja, aber FillRect kennt glaube ich nicht jeder.... Vielleicht sollten wir das mal mehr in den Vordergrund rücken.Du hast recht. Ist etwas verwirrend. Brush.Color/FillRect wäre klarer, aber hier auch überflüssig.
Den Umgang. Es gibt zwar ein Beispiel, aber mir ist es noch nicht gelungen z.b. das Beispiel zu verändern z.b. eine Line zu Zeichnen, und daraus ein Viereck oder der gleichen.Was verstehst du daran nicht?
Mach doch mal ein Beispiel dazu *G*
MFG
Michael Springwald
Michael Springwald
Re: Fragen zur Farbgebung von Pixeln
Kann ich machen. Also ein einfaches Beispiel. Zeichnet eine rote Linie auf gelben Hintergrund und zeigt das Ganze auf einem TImage.
Code: Alles auswählen
uses fpImage,IntfGraphics;
procedure TForm1.Button1Click(Sender:TObject);
var Li:TLazIntfImage;
x:integer;
begin
Li:=TLazIntfImage.Create(0,0);
Li.DataDescription := GetDescriptionFromDevice(0);
Li.SetSize(Image1.Width,Image1.Height);
Li.FillPixels(colyellow);
for x:=0 to Li.Width-1 do Li.Colors[x,10]:=colred;
Image1.Picture.Bitmap.LoadFromIntfImage(Li);
Li.free;
end;
Zuletzt geändert von theo am Di 18. Mai 2010, 15:28, insgesamt 1-mal geändert.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Fragen zur Farbgebung von Pixeln
Danke für das Beispiel... Vielleicht nützt es mir bei meinem Aktuellen Projekt was: Ein Sykraods Clone *G* Im Moment mache ich das einfach über Canvas.
Aha, du musst es wieder Sichtbar machen... Also musst du Doppelt Zeichnen.
Aha, du musst es wieder Sichtbar machen... Also musst du Doppelt Zeichnen.
MFG
Michael Springwald
Michael Springwald
Re: Fragen zur Farbgebung von Pixeln
So kann man das nicht sagen. Es wird im Speicher gezeichnet und dann in ein Graphics.TBitmap gepappt. Ähnlich wie OpBitmap.pluto hat geschrieben: Aha, du musst es wieder Sichtbar machen... Also musst du Doppelt Zeichnen.
-
- Lazarusforum e. V.
- Beiträge: 7192
- Registriert: So 19. Nov 2006, 12:06
- OS, Lazarus, FPC: Linux Mint 19.3
- CPU-Target: AMD
- Wohnort: Oldenburg(Oldenburg)
Re: Fragen zur Farbgebung von Pixeln
Doch ! Es ist Quasi ein Buffer. Ein "Double Buffer". Aber wenn dieser Weg schneller ist als über TBitMap, werde ich ihn mal Ausprobieren. Ich hätte da auch noch eine eigene ListView *G* wo ich gut noch ein Paar MS oder Sekunden Raus Holen könnte *G*.So kann man das nicht sagen. Es wird im Speicher gezeichnet und dann in ein Graphics.TBitmap gepappt. Ähnlich wie OpBitmap.
MFG
Michael Springwald
Michael Springwald
-
- Lazarusforum e. V.
- Beiträge: 3178
- Registriert: Di 22. Jul 2008, 19:27
- OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
- CPU-Target: 32bit x86 armhf
- Wohnort: Köln
- Kontaktdaten:
Re: Fragen zur Farbgebung von Pixeln
Wenn es dir um die Geschwindigkeit geht, wäre es dann nicht schneller, direkt in den Framebuffer deiner Grafikkarte mit OpenGl/Direct3D zu zeichnen?pluto hat geschrieben:Doch ! Es ist Quasi ein Buffer. Ein "Double Buffer". Aber wenn dieser Weg schneller ist als über TBitMap, werde ich ihn mal Ausprobieren. Ich hätte da auch noch eine eigene ListView *G* wo ich gut noch ein Paar MS oder Sekunden Raus Holen könnte *G*.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein