funktion um integerWert in FPColor umsetzen

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
wernkrau38
Beiträge: 32
Registriert: Di 8. Mär 2016, 11:46
OS, Lazarus, FPC: Windows10
CPU-Target: Win64

funktion um integerWert in FPColor umsetzen

Beitrag von wernkrau38 »

Ich will in einer Pixelgrafik mit Drawpixel die Pixel-Farbe setzen.
Der Farbwert muß vom Typ FPColor sein; ich habe aber nur einen Integer-Wert.
Ich suche dafür eine Funktion.

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

Re: funktion um integerWert in FPColor umsetzen

Beitrag von theo »


Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7030
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: funktion um integerWert in FPColor umsetzen

Beitrag von af0815 »

Wenn du nur einen Integerwert hast - wie ist der kodiert ? Weil die Werte sind alles nur (LongInteger-)Zahlen, die Frage ist wie ist der intern kodiert (BGR, RGB,..) da FPColor ein Record ist und nicht nur eine kodierte Zahl

Code: Alles auswählen

  TFPColor = record
    Red,Green,Blue,Alpha : word;
  end; 
  
und somit RGBA kodiert.
Woher hast du den "Integer" Wert ?
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wernkrau38
Beiträge: 32
Registriert: Di 8. Mär 2016, 11:46
OS, Lazarus, FPC: Windows10
CPU-Target: Win64

Re: funktion um integerWert in FPColor umsetzen

Beitrag von wernkrau38 »

So habe ich die Lösung gefunden:

MdColor:= TColorToFPColor(StringToColor(IntToStr(XYColor )));

Panel2.canvas.drawPixel(XS, YSH - YS, MdColor);

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

Re: funktion um integerWert in FPColor umsetzen

Beitrag von theo »

wernkrau38 hat geschrieben: Do 11. Dez 2025, 11:18 So habe ich die Lösung gefunden:

MdColor:= TColorToFPColor(StringToColor(IntToStr(XYColor )));

Panel2.canvas.drawPixel(XS, YSH - YS, MdColor);
Diese komplizierte Mehrfachumwandlung sieht etwas unbeholfen aus.
Wenn du uns erklären würdest, was dein "Integerwert" genau bedutet, könnte man das sicher besser machen.
af0815 hatte dich auch schon darum gebeten.

Benutzeravatar
Zvoni
Beiträge: 488
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: funktion um integerWert in FPColor umsetzen

Beitrag von Zvoni »

theo hat geschrieben: Do 11. Dez 2025, 12:16
wernkrau38 hat geschrieben: Do 11. Dez 2025, 11:18 So habe ich die Lösung gefunden:

MdColor:= TColorToFPColor(StringToColor(IntToStr(XYColor )));

Panel2.canvas.drawPixel(XS, YSH - YS, MdColor);
Diese komplizierte Mehrfachumwandlung sieht etwas unbeholfen aus.
Wenn du uns erklären würdest, was dein "Integerwert" genau bedutet, könnte man das sicher besser machen.
af0815 hatte dich auch schon darum gebeten.
Da er StringToColor mit IntToStr verwendet, wird sein Integer wahrscheinlich irgendwie so aussehen
25500127, wobei das natürlich mal überhaupt nicht wasserdicht ist:
255001 --> Ist das jetzt 255 00 1 oder 25 50 01 ?
Hätte eher IntToHex verwendet, weil das sowieso nen String zurückgibt.
Ist auch viel einfacher für Plausicheck (RGB -> 6 Stellen lang, RGBA -> 8 Stellen).
Und StringToColor erwartet entweder einen Enum-Namen "clRed" oder Hex-String in GBR-Byte-Order
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

wernkrau38
Beiträge: 32
Registriert: Di 8. Mär 2016, 11:46
OS, Lazarus, FPC: Windows10
CPU-Target: Win64

Re: funktion um integerWert in FPColor umsetzen

Beitrag von wernkrau38 »

Dabei war ich so froh ,eine Lösung für die Farbe im Drawpixel gefunden zu haben.
Aber etwas umständlich ist es schon!
Der IntWert kommt bei einer ItrationsSchleife für eine Mandelbrotmenge zu Stande:

repeat
T := X;
X := Power(X,2) - Power(Y,2) + X0;
Y := 2 * T * Y + Y0;
Inc(Iter);
until (Sqr(X) + Sqr(Y) > 4) or (Iter = NIters);

XYColor := Iter*100000;
MdColor:= TColorToFPColor(StringToColor(IntToStr(XYColor )));
Panel2.canvas.drawPixel(XS, YSH - YS, MdColor);

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7030
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: funktion um integerWert in FPColor umsetzen

Beitrag von af0815 »

Ohne Umweg über den String sollte es so gehen

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  iter: integer;
  XYColor: LongInt;
  mdColor: TFPColor;
begin
  iter:= 11;
  XYColor := Iter*100000;
  MdColor:= TColorToFPColor(TColor(XYColor));
end;
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

wernkrau38
Beiträge: 32
Registriert: Di 8. Mär 2016, 11:46
OS, Lazarus, FPC: Windows10
CPU-Target: Win64

Re: funktion um integerWert in FPColor umsetzen

Beitrag von wernkrau38 »

Ja, Prima; das funktioniert.

Danke Euch fürs mitdenken.

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

Re: funktion um integerWert in FPColor umsetzen

Beitrag von theo »

af0815 hat geschrieben: Do 11. Dez 2025, 18:17 Ohne Umweg über den String sollte es so gehen

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var
  iter: integer;
  XYColor: LongInt;
  mdColor: TFPColor;
begin
  iter:= 11;
  XYColor := Iter*100000;
  MdColor:= TColorToFPColor(TColor(XYColor));
end;
Den Typecast braucht es aber mMn nicht.
Kompiliert auch so:

Code: Alles auswählen

  MdColor:= TColorToFPColor(XYColor);       
Womit wir dann wieder bei Antwort Nr. 1 wären.
Ich verstehe die Windungen dieses Threads nicht ganz.

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 7030
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: funktion um integerWert in FPColor umsetzen

Beitrag von af0815 »

Jetzt ist es klarer woher der Wert kommt. Der Wert war das Ziel, nicht der Weg :-)
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten