Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RGB nach HSV und zurück (https://www.delphipraxis.net/50519-rgb-nach-hsv-und-zurueck.html)

Opa Knack 27. Jul 2005 00:52


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

Aya 27. Jul 2005 02:42

Re: RGB nach HSV und zurück
 
Hi,

eine funktion die ich mir dafür mal gemacht hab:

Delphi-Quellcode:
  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;
Au'revoir,
Aya~

Kroko1999 27. Jul 2005 07:07

Re: RGB nach HSV und zurück
 
siehe auch
Delphi-Quellcode:
unit GraphUtil;

Opa Knack 27. Jul 2005 22:37

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

Aya 28. Jul 2005 02:26

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:
var
  color: TColorHSV;
  h, s, v: Extended;
begin
  color:=RGBtoHSV(1, 0, 0);
  h:=color.h;
  s:=color.s;
  v:=color.v;
end;
Au'revoir,
Aya~

x000x 28. Jul 2005 02:47

Re: RGB nach HSV und zurück
 
Moin moin,

Zitat:

Zitat von Opa Knack
...und auszutesten, jedoch bringe ich ihn nicht ans Laufen...

Delphi-Quellcode:
type
// ^-- @Opa Knack: hast evtl. vergessen? 
  TColorRGB = Record
  //public <-- gehört nicht hier rein
    R, G, B: Extended;
  end;

Aya 28. Jul 2005 14:52

Re: RGB nach HSV und zurück
 
Zitat:

Zitat von x000x
Delphi-Quellcode:
  TColorRGB = Record
  //public <-- gehört nicht hier rein
    R, G, B: Extended;
  end;

Oh.. ups... vergessen das public rauszunehmen... bei mir im Original is das nen Object, kein Record... sorry.. :)

Au'revoir,
Aya~

barf00s 28. Jul 2005 14:54

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>

Aya 28. Jul 2005 15:00

Re: RGB nach HSV und zurück
 
Zitat:

Zitat von barf00s
wieso eigentlich extended ;)
und warum wieder TColorHSV, das könnte man doch auch handlicherweise innem integer unterbringen...
</rhetorischfrag>

Hi,

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~

barf00s 28. Jul 2005 15:04

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 19:33 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz