![]() |
RGB nach HSV und zurück
Hallo,
zwar gibt es viele Postings dazu, jedoch habe ich keines finden können, das mir weiterhilft: Ich möchte RGB-Werte in HSV-Werte umrechnen. Die Codes, die ich bislang gefunden habe, berechnen mir da zwar irgendwas, jedoch liegen die SV-Werte über 100, was bei einem prozentualen Wert nicht unbedingt richtig sein kann. So sollte z. B. ein voll ausgenutzter Rot-Kanal den S-Wert 100 ergeben, da die Farbe ja zu 100% gesättigt ist, und wenn Schwarz gewählt wird, sollte der V-Wert bei 0% liegen (bzw. bei Weiss 100%). Kennt jemand eine Funktion, die diese Werte errechnet und diese auch wieder in RGB zurückwandeln kann? Danke Opa |
Re: RGB nach HSV und zurück
Hi,
eine funktion die ich mir dafür mal gemacht hab:
Delphi-Quellcode:
Au'revoir,
TColorRGB = Record
public R, G, B: Extended; end; TColorHSV = Record H, S, V: Extended; end; function RGBtoHSV(R, G, B: Extended): TColorHSV; function Min(V1, V2, V3: Extended): Extended; begin Result:=V1; if V2 < Result then Result:=V2; if V3 < Result then Result:=V3; end; function Max(V1, V2, V3: Extended): Extended; begin Result:=V1; if V2 > Result then Result:=V2; if V3 > Result then Result:=V3; end; var deltaValue, minValue, maxValue: Extended; deltaR, deltaG, deltaB: Extended; begin minValue:=Min(R, G, B); maxValue:=Max(R, G, B); deltaValue:=maxValue - minValue; Result.V:=maxValue; if deltaValue = 0 then begin Result.H:=0; Result.S:=0; end else begin Result.S:=deltaValue / maxValue; deltaR:=(((maxValue - R) / 6) + (deltaValue / 2 )) / deltaValue; deltaG:=(((maxValue - G) / 6) + (deltaValue / 2 )) / deltaValue; deltaB:=(((maxValue - B) / 6) + (deltaValue / 2 )) / deltaValue; if R = maxValue then Result.H:=deltaB - deltaG else if G = maxValue then Result.H:=(1 / 3) + deltaR - deltaB else if B = maxValue then Result.H:=(2 / 3) + deltaG - deltaR; if Result.H < 0 then Result.H:=Result.H + 1; if Result.H > 1 then Result.H:=Result.H - 1; end; end; function HSVtoRGB(H, S, V: Extended): TColorRGB; var var_h, var_i, var_1, var_2, var_3: Extended; begin if S = 0 then begin Result.R:=V * 255; Result.G:=V * 255; Result.B:=V * 255; end else begin var_h:=H * 6; var_i:=floor(var_h); var_1:=V * (1 - S); var_2:=V * (1 - S * (var_h - var_i)); var_3:=V * (1 - S * (1 - (var_h - var_i))); if var_i = 0 then begin Result.R:=V; Result.G:=var_3; Result.B:=var_1; end else if var_i = 1 then begin Result.R:=var_2; Result.G:=V; Result.B:=var_1; end else if var_i = 2 then begin Result.R:=var_1; Result.G:=V; Result.B:=var_3; end else if var_i = 3 then begin Result.R:=var_1; Result.G:=var_2; Result.B:=V; end else if var_i = 4 then begin Result.R:=var_3; Result.G:=var_1; Result.B:=V; end else begin Result.R:=V; Result.G:=var_1; Result.B:=var_2; end; Result.R:=Result.R * 255; Result.G:=Result.G * 255; Result.B:=Result.B * 255; end; end; Aya~ |
Re: RGB nach HSV und zurück
siehe auch
Delphi-Quellcode:
unit GraphUtil;
|
Re: RGB nach HSV und zurück
Hallo,
Danke für die Antworten. Die Unit GraphUtil habe ich bei meinem D7 leider nicht - gibt es dazu vielleicht eine Alternative? Den Code habe ich versucht einzubinden und auszutesten, jedoch bringe ich ihn nicht ans Laufen. Es wird bemängelt, dass das R, G, B nicht akzeptiert wird. Ich finde jedoch keine Möglichkeit, diesen Fehler zu umgehen. Abgesehen davon (alter Mann ist halt nicht mehr so flexibel) wüßte ich auch noch nicht, wie ich die Funktionen genau aufrufen soll bzw. wie ich die Werte auslese. Klar ist, dass ich mit RGBtoHSV die RGB-Werte umrechne, nur wie splitte ich den Rückgabewert so auf, dass ich die HSV-Werte einzeln vorliegen habe? Danke nochmal Opa |
Re: RGB nach HSV und zurück
Hi,
bei RGBtoHSV mußt du die RGB werte in einem bereich von 0..1 übergeben und bekommst als rückgabewert einen TColorHSV. Da kannst du dann so drauf zugreifen:
Delphi-Quellcode:
Au'revoir,
var
color: TColorHSV; h, s, v: Extended; begin color:=RGBtoHSV(1, 0, 0); h:=color.h; s:=color.s; v:=color.v; end; Aya~ |
Re: RGB nach HSV und zurück
Moin moin,
Zitat:
Delphi-Quellcode:
type
// ^-- @Opa Knack: hast evtl. vergessen? TColorRGB = Record //public <-- gehört nicht hier rein R, G, B: Extended; end; |
Re: RGB nach HSV und zurück
Zitat:
Au'revoir, Aya~ |
Re: RGB nach HSV und zurück
wieso eigentlich extended ;)
und warum wieder TColorHSV, das könnte man doch auch handlicherweise innem integer unterbringen... </rhetorischfrag> |
Re: RGB nach HSV und zurück
Zitat:
extended weil da wo ich es ursprünglich brauchte, brauchte ich exakte ergebnisse ;) Kann man aber wenn es nur um die farbe von 0..255 geht getrost auch Single verwenden :) und TColorHSV weil es ja drei rückgabe werte gibt... klar, ich könnte es als Procedure machen und da die results als var übergeben... aber das ist geschmackssache, und das sollte jeder der die funktion verwendet auch selber hinbekommen ;) Au'revoir, Aya~ |
Re: RGB nach HSV und zurück
ich sag ja nix dagegen - hab mich nur gewundert, weil ich innem byte 0..255 reinbekomm und innem integer sogar 4 bytes ;)
son TColorRGB in extended'er form verschlingt "unmengen" an speicher (selbst single 3*4bytes) - und son integer'chen nur 4 bytes </senf> |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 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 by Thomas Breitkreuz