Fragen zur Farbgebung von Pixeln

Für Fragen von Einsteigern und Programmieranfängern...
400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Fragen zur Farbgebung von Pixeln

Beitrag von 400kmh »

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?

Socke
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

Beitrag von Socke »

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?
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.
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.
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?
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.
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

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zur Farbgebung von Pixeln

Beitrag von theo »

1. Zeichne im OnPaint Ereignis oder auf ein TImage Bitmap.
2. z.B. mit function RGBToColor(R, G, B: Byte): TColor;

Euklid
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

Beitrag von Euklid »

Hallo 400km/h!

Zunächst: Wenn Du Einsteiger bist, vergiss alle Ratschläge mit dem OnPaint-Ereignis. ;)
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?
Diese Frage taucht immer wieder auf - und ist schnell beantwortet:
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;
... dann bleibt das gezeichnete Muster erhalten - egal, ob Du die Form verschiebst, den Desktop wechselst oder minimierst/maximierst.
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?
Solche Befehle gibt es auch bei 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

400kmh
Beiträge: 100
Registriert: Do 25. Mär 2010, 04:03

Re: Fragen zur Farbgebung von Pixeln

Beitrag von 400kmh »

Danke für die Antworten.
Socke hat geschrieben:Möchtest du eine mathematische Funktion zeichnen?
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.
Euklid hat geschrieben:Zunächst: Wenn Du Einsteiger bist, vergiss alle Ratschläge mit dem OnPaint-Ereignis. ;)
Was ist denn der Nachteil des OnPaint-Ereignis (für Einsteiger)?

Socke
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

Beitrag von Socke »

400kmh hat geschrieben:
Euklid hat geschrieben:Zunächst: Wenn Du Einsteiger bist, vergiss alle Ratschläge mit dem OnPaint-Ereignis. ;)
Was ist denn der Nachteil des OnPaint-Ereignis (für Einsteiger)?
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.
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

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zur Farbgebung von Pixeln

Beitrag von theo »

@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;

pluto
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

Beitrag von pluto »

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.

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.
Und wer soll sich damit auskennen ? Ich habe hier kaum jemand getroffen der sich damit wirklich auskennt. Außer dir.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zur Farbgebung von Pixeln

Beitrag von theo »

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.
Du hast recht. Ist etwas verwirrend. Brush.Color/FillRect wäre klarer, aber hier auch überflüssig.

pluto hat geschrieben: Und wer soll sich damit auskennen ? Ich habe hier kaum jemand getroffen der sich damit wirklich auskennt. Außer dir.
Was verstehst du daran nicht?

pluto
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

Beitrag von pluto »

Du hast recht. Ist etwas verwirrend. Brush.Color/FillRect wäre klarer, aber hier auch überflüssig.
Ja, aber FillRect kennt glaube ich nicht jeder.... Vielleicht sollten wir das mal mehr in den Vordergrund rücken.
Was verstehst du daran nicht?
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.
Mach doch mal ein Beispiel dazu *G*
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zur Farbgebung von Pixeln

Beitrag von theo »

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.

pluto
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

Beitrag von pluto »

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.
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Fragen zur Farbgebung von Pixeln

Beitrag von theo »

pluto hat geschrieben: Aha, du musst es wieder Sichtbar machen... Also musst du Doppelt Zeichnen.
So kann man das nicht sagen. Es wird im Speicher gezeichnet und dann in ein Graphics.TBitmap gepappt. Ähnlich wie OpBitmap.

pluto
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

Beitrag von pluto »

So kann man das nicht sagen. Es wird im Speicher gezeichnet und dann in ein Graphics.TBitmap gepappt. Ähnlich wie OpBitmap.
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
Michael Springwald

Socke
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

Beitrag von Socke »

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*.
Wenn es dir um die Geschwindigkeit geht, wäre es dann nicht schneller, direkt in den Framebuffer deiner Grafikkarte mit OpenGl/Direct3D zu zeichnen?
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten