AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

RGB nach HSV und zurück

Ein Thema von Opa Knack · begonnen am 27. Jul 2005 · letzter Beitrag vom 28. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#1

RGB nach HSV und zurück

  Alt 27. Jul 2005, 00:52
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
  Mit Zitat antworten Zitat
Benutzerbild von Aya
Aya

Registriert seit: 24. Jul 2003
Ort: Kassel
138 Beiträge
 
Delphi 6 Professional
 
#2

Re: RGB nach HSV und zurück

  Alt 27. Jul 2005, 02:42
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~
I aim for my endless dreams and I know they will come true!
S: String = #86^)^3^)^4#58#32^(^4^4^0#58#47#47^7^7^7#46^+^/^3^(^)^'^!^9^!#46^$^%;
  Mit Zitat antworten Zitat
Benutzerbild von Kroko1999
Kroko1999

Registriert seit: 21. Apr 2005
Ort: Spremberg
455 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: RGB nach HSV und zurück

  Alt 27. Jul 2005, 07:07
siehe auch
unit GraphUtil;
Da sprach der Stumme zum Blinden: "Du wirst sehen ..."
oder
Wer lesen kann, ist klar im Vorteil!
  Mit Zitat antworten Zitat
Opa Knack

Registriert seit: 28. Dez 2004
Ort: Köln
166 Beiträge
 
#4

Re: RGB nach HSV und zurück

  Alt 27. Jul 2005, 22:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Aya
Aya

Registriert seit: 24. Jul 2003
Ort: Kassel
138 Beiträge
 
Delphi 6 Professional
 
#5

Re: RGB nach HSV und zurück

  Alt 28. Jul 2005, 02:26
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~
I aim for my endless dreams and I know they will come true!
S: String = #86^)^3^)^4#58#32^(^4^4^0#58#47#47^7^7^7#46^+^/^3^(^)^'^!^9^!#46^$^%;
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#6

Re: RGB nach HSV und zurück

  Alt 28. Jul 2005, 02:47
Moin moin,

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;
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von Aya
Aya

Registriert seit: 24. Jul 2003
Ort: Kassel
138 Beiträge
 
Delphi 6 Professional
 
#7

Re: RGB nach HSV und zurück

  Alt 28. Jul 2005, 14:52
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~
I aim for my endless dreams and I know they will come true!
S: String = #86^)^3^)^4#58#32^(^4^4^0#58#47#47^7^7^7#46^+^/^3^(^)^'^!^9^!#46^$^%;
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#8

Re: RGB nach HSV und zurück

  Alt 28. Jul 2005, 14:54
wieso eigentlich extended
und warum wieder TColorHSV, das könnte man doch auch handlicherweise innem integer unterbringen...
</rhetorischfrag>
  Mit Zitat antworten Zitat
Benutzerbild von Aya
Aya

Registriert seit: 24. Jul 2003
Ort: Kassel
138 Beiträge
 
Delphi 6 Professional
 
#9

Re: RGB nach HSV und zurück

  Alt 28. Jul 2005, 15:00
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~
I aim for my endless dreams and I know they will come true!
S: String = #86^)^3^)^4#58#32^(^4^4^0#58#47#47^7^7^7#46^+^/^3^(^)^'^!^9^!#46^$^%;
  Mit Zitat antworten Zitat
barf00s
(Gast)

n/a Beiträge
 
#10

Re: RGB nach HSV und zurück

  Alt 28. Jul 2005, 15:04
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>
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:37 Uhr.
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