![]() |
RGB <--> HLS <--> HSV
Ich bin noch Anfänger und weiß gar nicht so recht, wie ich bei meinem Programm anfangen soll.
Es soll ein Feld zu sehen sein, dass mit einer Farbe gefüllt wird. Daneben sollen Scrollbars sein, mit denen die jeweiligen Farbwerte eingegeben werden können. Wenn nun in ein Farbwertsystem ein Wert eingeben wird (nicht als Zahl, sondern mit einem Schieberegler), dann sollen sich auch die Schieberegler der anderen Farbwertsysteme ändern und natürlich auch die angezeigte Farbe. Soweit verständlich? Ich steh irgendwie total aufm Schlauch. Schonmal: Danke. :) P.S.: Muss das ganze mit "Borland Delphi 5" zusammenbasteln... |
Re: RGB <--> HLS <--> HSV
Hi,
fürs erste mal bloß ein paar Suchbegriffe: ![]() ![]() ![]() ![]() ![]() Damit dürfte schon einiges zu machen sein :) Sag bescheid, wenn ein konkretes Problem auftaucht :stupid: edit: Statt TScrollBar eignet sich evtl. eine TTrackBar besser :stupid: Gruß Stephan :dance: |
Re: RGB <--> HLS <--> HSV
Vielleicht ein bischen overpowered, aber die JVCL enthaelt TJvFullColor Dialoge.
Die koennen Farbraeume handhaben. |
Re: RGB <--> HLS <--> HSV
Zitat:
|
Re: RGB <--> HLS <--> HSV
ich haue mal noch die Unit GraphUtil rein, da sind schon ein paar Proc/Func zum Umrechnen der Farbe!
|
Re: RGB <--> HLS <--> HSV
Liste der Anhänge anzeigen (Anzahl: 1)
ich habe jetzt ein wenig gebastelt und folgendes erstellt:
Delphi-Quellcode:
damit zeigt mir mein programm erstmal die farben an (in einem tform-feld).
//SCROLLBALKEN ROT
procedure TForm1.ScrollBar1Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin label1.caption:=inttostr(scrollbar1.Position ); //Position ausgeben (Zahl) Farbfeld.Brush.Color:=StrToInt('$'+((inttohex(scrollbar3.Position,2)+ //Blau-Anteil inttohex(scrollbar2.Position,2)+ //Grün-Anteil inttohex(scrollbar1.Position,2)))); // Rot-Anteil end; //SCROLLBALKEN GRÜN procedure TForm1.ScrollBar2Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin label2.caption:=inttostr(scrollbar2.Position ); //Position ausgeben (Zahl) Farbfeld.Brush.Color:=StrToInt('$'+((inttohex(scrollbar3.Position,2)+ //Blau-Anteil inttohex(scrollbar2.Position,2)+ //Grün-Anteil inttohex(scrollbar1.Position,2)))); // Rot-Anteil end; //SCROLLBALKEN BLAU procedure TForm1.ScrollBar3Scroll(Sender: TObject; ScrollCode: TScrollCode; var ScrollPos: Integer); begin label3.caption:=inttostr(scrollbar3.Position ); //Position ausgeben (Zahl) Farbfeld.Brush.Color:=StrToInt('$'+((inttohex(scrollbar3.Position,2)+ //Blau-Anteil inttohex(scrollbar2.Position,2)+ //Grün-Anteil inttohex(scrollbar1.Position,2)))); // Rot-Anteil end; kann man die drei prozeduren irgendwie zusammen fassen? weil nun muss es ja mit der umrechnung weiter gehen. und da isses bissl umständlich jedesmal in ne einzelne prozedur zu rennen, oder? wie kann ich es jetzt machen, dass ich die werte der einzelnen farbanteile auslesen kann und dann daraus die hsv- bzw. hls-farbanteile auslesen kann, damit dann weiterrechnen und sie wieder im farbfeld ausgeben kann. dabei müssten sich dann die jeweiligen scrollbalken und auch labels mit-ändern. war die fragestellung jetzt logisch? so sieht das prgramm übrigens bis jetzt aus: |
Re: RGB <--> HLS <--> HSV
mal gleich noch ne frage hinterher:
hilft es, die variablen (also die position der scrollbars) global zu definieren und wo geht das? |
Re: RGB <--> HLS <--> HSV
z.B.
Delphi-Quellcode:
Edit: evtl währe ja ein kleiner
var
Form1 : TForm1; GlobalVar1 : Integer; GloballArray : array[1..3] of Integer ![]() |
Re: RGB <--> HLS <--> HSV
soweit steht mein programm, also schonmal danke, an alle die bis jetzt geholfen haben. aber ich hab noch ein problem:
ich finde irgendwie keine formel, mit der man RGB in HLS umrechnen kann. hat jemand vielleicht so eine irgendwo rumliegen? idealerweise schon als algorithmus. :) danke :) |
Re: RGB <--> HLS <--> HSV
Liste der Anhänge anzeigen (Anzahl: 1)
Servus,
anbei eine Unit für HLStoRGB und umgekehrt |
Re: RGB <--> HLS <--> HSV
mein algorithmus is ähnlich. aber irgendwie meint er, ich würde durch 0 teilen.
"gleitkommadivision durch 0"
Delphi-Quellcode:
procedure TForm1.RGB(Sender: TObject; ScrollCode: TScrollCode;
var ScrollPos: Integer); var RGB_R, RGB_G, RGB_B : Real; HLS_H, HLS_L, HLS_S : Real; HSV_H, HSV_S, HSV_V : Real; max_Farbwert : real; min_Farbwert : real; Differenz : real; Summe : real; RGB_R_temp, RGB_G_temp, RGB_B_temp : Real; HLS_H_temp, HLS_L_temp, HLS_S_temp : Real; HSV_H_temp, HSV_S_temp, HSV_V_temp : Real; begin RGB_R := Scrollbar1.Position; RGB_G := Scrollbar2.Position; RGB_B := Scrollbar3.Position; max_Farbwert := max(RGB_R, max(RGB_G,RGB_B)); min_Farbwert := min(RGB_R, min(RGB_G,RGB_B)); Differenz := max_Farbwert - min_Farbwert; Summe := max_Farbwert + min_Farbwert; //Berechnung RGB-->HLS RGB_R_temp:=RGB_R/255; RGB_G_temp:=RGB_G/255; RGB_B_temp:=RGB_B/255; HLS_L:=(max_Farbwert+min_Farbwert)/2; if min_Farbwert=max_Farbwert then begin HLS_H:=0; HLS_S:=0; end; if (min_Farbwert <> max_Farbwert) then begin if (HLS_L < 0.50) then HLS_S:=Differenz/Summe; if (HLS_L >= 0.50) then HLS_S:=Differenz/(2-Differenz); if RGB_R_temp = max_Farbwert then HLS_H := (RGB_G - RGB_B) / Differenz; if RGB_G_temp = max_Farbwert then HLS_H := 2 + (RGB_B - RGB_R) / Differenz; if RGB_B_temp = max_Farbwert then HLS_H := 4 + (RGB_R - RGB_G) / Differenz; HLS_H:=HLS_H/6; if (HLS_H<0) then HLS_H:=HLS_H+1; end; scrollbar4.Position := round(HLS_H*360); scrollbar5.Position := round(HLS_L*100); scrollbar6.Position := round(HLS_S*100); end; |
Re: RGB <--> HLS <--> HSV
Wie kann ich das Dividieren durch 0 abfangen?
Bzw. was mache ich, wenn die Differenz=2 wird, was ja passieren kann?
Delphi-Quellcode:
HLS_S := Differenz / (2-Differenz);
Delphi-Quellcode:
Differenz := max_Farbwert - min_Farbwert;
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz