Farben berechnen

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Farben berechnen

Beitrag von Andromeda »

Hallo,

ich möchte mir ein kleines Programm schreiben, mit dem ich Farbwerte berechnen kann. Das Programm soll also beispielsweise die Mischfarbe von zwei anderen Farben berechnen. Damit ich mit den HEX-Werten rechnen kann, wollte ich sie erst mal in Dezimalwerte umrechnen. Das habe ich jetzt auch hinbekommen. Doch je länger der Quellcode wird, um so stärker beschleicht mich das Gefühl, dass es dafür vermutlich eine viel einfachere Lösung gibt. So sieht mein Quellcode für das Umrechnen der HEX-Werte bisher aus:

Code: Alles auswählen

 
procedure TFormHaupt.rechnen;
var
  i, Ergebnis, Wert: integer;
  c, Farbe1, Wert1, Wert2, Wert3: string;
begin
  Ergebnis := 0;
  Wert := 0;
  Wert1 := '';
  Wert2 := '';
  Wert3 := '';
  Farbe1 := '';
  for i:=1 to 6 do
  begin
    c := LowerCase(copy(EditHauptfarbe.text, i, 1));
    Farbe1 := Farbe1 + c;
  end;
  Label1.Caption:=Farbe1;
  c := copy(Farbe1, 1, 1);
  if c = 'a' then begin
    Ergebnis := (Ergebnis + 10) end else
    if c = 'b' then begin
      Ergebnis := (Ergebnis + 11) end else
      if c = 'c' then begin
        Ergebnis := (Ergebnis + 12) end else
        if c = 'd' then begin
          Ergebnis := (Ergebnis + 13) end else
          if c = 'e' then begin
            Ergebnis := (Ergebnis + 14) end else
            if c = 'f' then begin
              Ergebnis := (Ergebnis + 15) end else
                Ergebnis := (Ergebnis + StrToInt(c));
  Wert := Ergebnis*15;
  c := copy(Farbe1, 2, 1);
  if c = 'a' then begin
    Ergebnis := (Ergebnis + 10) end else
    if c = 'b' then begin
      Ergebnis := (Ergebnis + 11) end else
      if c = 'c' then begin
        Ergebnis := (Ergebnis + 12) end else
        if c = 'd' then begin
          Ergebnis := (Ergebnis + 13) end else
          if c = 'e' then begin
            Ergebnis := (Ergebnis + 14) end else
            if c = 'f' then begin
              Ergebnis := (Ergebnis + 15) end else
                Ergebnis := (Ergebnis + StrToInt(c));
  Wert :=  Wert + Ergebnis;
  Wert1 := IntToStr(Wert);
  LabelWert1.Caption:=Wert1;
 
  Ergebnis := 0;
  c := copy(Farbe1, 3, 1);
  if c = 'a' then begin
    Ergebnis := (Ergebnis + 10) end else
    if c = 'b' then begin
      Ergebnis := (Ergebnis + 11) end else
      if c = 'c' then begin
        Ergebnis := (Ergebnis + 12) end else
        if c = 'd' then begin
          Ergebnis := (Ergebnis + 13) end else
          if c = 'e' then begin
            Ergebnis := (Ergebnis + 14) end else
            if c = 'f' then begin
              Ergebnis := (Ergebnis + 15) end else
                Ergebnis := (Ergebnis + StrToInt(c));
  Wert := Ergebnis*15;
  c := copy(Farbe1, 4, 1);
  if c = 'a' then begin
    Ergebnis := (Ergebnis + 10) end else
    if c = 'b' then begin
      Ergebnis := (Ergebnis + 11) end else
      if c = 'c' then begin
        Ergebnis := (Ergebnis + 12) end else
        if c = 'd' then begin
          Ergebnis := (Ergebnis + 13) end else
          if c = 'e' then begin
            Ergebnis := (Ergebnis + 14) end else
            if c = 'f' then begin
              Ergebnis := (Ergebnis + 15) end else
                Ergebnis := (Ergebnis + StrToInt(c));
  Wert :=  Wert + Ergebnis;
  Wert2 := IntToStr(Wert);
  LabelWert2.Caption:=Wert2;
 
  Ergebnis := 0;
  c := copy(Farbe1, 5, 1);
  if c = 'a' then begin
    Ergebnis := (Ergebnis + 10) end else
    if c = 'b' then begin
      Ergebnis := (Ergebnis + 11) end else
      if c = 'c' then begin
        Ergebnis := (Ergebnis + 12) end else
        if c = 'd' then begin
          Ergebnis := (Ergebnis + 13) end else
          if c = 'e' then begin
            Ergebnis := (Ergebnis + 14) end else
            if c = 'f' then begin
              Ergebnis := (Ergebnis + 15) end else
                Ergebnis := (Ergebnis + StrToInt(c));
  Wert := Ergebnis*15;
  c := copy(Farbe1, 6, 1);
  if c = 'a' then begin
    Ergebnis := (Ergebnis + 10) end else
    if c = 'b' then begin
      Ergebnis := (Ergebnis + 11) end else
      if c = 'c' then begin
        Ergebnis := (Ergebnis + 12) end else
        if c = 'd' then begin
          Ergebnis := (Ergebnis + 13) end else
          if c = 'e' then begin
            Ergebnis := (Ergebnis + 14) end else
            if c = 'f' then begin
              Ergebnis := (Ergebnis + 15) end else
                Ergebnis := (Ergebnis + StrToInt(c));
  Wert :=  Wert + Ergebnis;
  Wert3 := IntToStr(Wert);
  LabelWert3.Caption:=Wert3;
 
  Label2.Caption := Wert1+' '+Wert2+' '+Wert3;
 
  Panel1.Color:=StringToColor('$' +Farbe1);
end;
 

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Farben berechnen

Beitrag von baumina »

Einfach mit StrToInt.
.

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Farben berechnen

Beitrag von Andromeda »

Ich gebe eine Farbe im HEX-Code ein, also beispielsweise 0000ff´. Das kann ich doch nicht mit StrToInt umwandeln

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Farben berechnen

Beitrag von baumina »

Warum nicht?

Code: Alles auswählen

showmessage(IntToStr(StrToInt('$0000ff'))); // liefert 255
showmessage(IntToHex(255,6)); // liefert 0000FF
 
.

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Farben berechnen

Beitrag von Andromeda »

Ich bräuchte die Funktion HEXToInt, aber das geht nicht.
Label3.Caption:= HEXToInt('$0000ff');

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Farben berechnen

Beitrag von baumina »

Was kommt denn raus, wenn du

Code: Alles auswählen

Label3.Caption:= IntToStr(StrToInt('$0000ff'));
machst? Bei meinem Delphi kommt 255 raus.
Zuletzt geändert von baumina am Mo 22. Feb 2016, 10:08, insgesamt 1-mal geändert.
.

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2813
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Farben berechnen

Beitrag von m.fuchs »

Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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

Re: Farben berechnen

Beitrag von theo »

Das Aufdröseln in RGB geht auch z.B. so:

Code: Alles auswählen

var
  r, g, b: Byte;
begin
  RedGreenBlue($091209,r,g,b);   
bzw.
  RedGreenBlue(StrToInt('$fa00ff'),r,g,b);  
 

Andromeda
Beiträge: 120
Registriert: So 4. Jan 2015, 20:18

Re: Farben berechnen

Beitrag von Andromeda »

Ok, vielen Dank. Jetzt habe ich meinen mühsam zusammengestellten Code wieder gelöscht. Das geht tatsächlich mit IntToStr. Aber mit HEXToDec komme ich trotzdem nicht zurecht. Ich habe die uses strutils eingebunden, aber Lazarus meldet Identifier not found "HEXToDec".

baumina
Beiträge: 152
Registriert: Mo 3. Feb 2014, 14:07
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Farben berechnen

Beitrag von baumina »

Heißt ja auch Hex2Dec, nicht HexToDec.
.

Antworten