Wpisany przez Tomasz Lubiński,
06 września 2005 22:09
Przeważnie pisząc aplikację nie możemy korzystać bezpośrednio z modelu HSV, należy go zatem przetransformować do używanego powszechnie modelu RGB. Zakładamy przy tym, że parametry wejściowe mają wartości: H od 0.0 do 359.9, a S oraz V pomiędzy 0.0 a 1.0. Natomiast wartości składowych wynikowego modelu RGB mieszczą się w przedziałach od 0.0 do 1.0.
HSV do RGB
RGB do HSV
HSV do RGB
dane wejsciowe: hue, sat, val
dane wyjsciowe: red, grn, blu
if(val==0) {red=0; grn=0; blu=0;}
else{
hue/=60;
i = Math.floor(hue);
f = hue-i;
p = val*(1-sat);
q = val*(1-(sat*f));
t = val*(1-(sat*(1-f)));
if (i==0) {red=val; grn=t; blu=p;}
else if (i==1) {red=q; grn=val; blu=p;}
else if (i==2) {red=p; grn=val; blu=t;}
else if (i==3) {red=p; grn=q; blu=val;}
else if (i==4) {red=t; grn=p; blu=val;}
else if (i==5) {red=val; grn=p; blu=q;}
}
RGB do HSV
x = MIN(MIN(red, grn), blu);
val = MAX(MAX(red, grn), blu);
if (x == val) {hue=0; sat=0;}
else {
if red == x
f = grn-blu
else
if grn == x
f = blu-red
else
f = red-grn;
if red == x
i = 3
else
if grn == x
i = 5
else
i = 1;
hue = ((i-f/(val-x))*60)%360;
sat = ((val-x)/val);
}
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Tomasz Lubiński | C/C++ | .cpp | .cpp | ***** / 11 | |
Tomasz Lubiński | Delphi/Pascal | .pas | .pas | ***** / 2 | |
Tomasz Lubiński | Java | .java | .java | ***** / 2 | |
Nikodem Solarz | Ruby | Metody przekształcające | .rb | .rb | ***** / 0 |
Poprawiony: 30 lipca 2012 19:07
DOWÓD: DLA red=0, grn=1, blu=1 oraz red=0, grn=1, blu=0 wychodzi ten sam HUE (red==x dla obu przypadków)
1. Dla red=0, grn=1, blu=1 mamy:
x = 0
val = 1
f = 0
i = 3
hue = (3-0) * 60 = 180
2. Dla red=0, grn=1, blu=0 mamy:
x = 0
val = 1
f = 1
i = 3
hue = (3-1) * 60 = 120
Obliczone wartości hue nie są takie same. Dla red = x, wartość f obliczana jest jako różnica pomiędzy grn i blu, zatem w obu wypadkach jest ona inna i co za tym idzie obliczona wartość hue też jest inna.