Hej.
Nie wiem dlaczego, ale czasami podczas konwersji z jednego modelu barw na drugi mam przerażające różnice (nie raz wyskakujące poza zakres), a czasami mam idealne wartości.
Funkcja działa zawsze tak samo dla danych wejściowych. Dla jednych dobrze dla innych źle.
Przypuszczam, że błąd jest gdzieś w algorytmie.
Bardzo proszę o pomoc.
Moje dane wejściowe z modelu RGB to zasięg liczb od 0 do 255 dla każdej składowej
zaś model HSV to zasięg od 0 do 240 dla każdej składowej
np dla danych:
RGB(50, 228, 113)
dostaję składowe HSV:
HSV(48, 93, 77);
a powinienem dostać:
HSV(94, 184, 131);
Z kolei dla danych jak np:
RGB(188, 100, 90);
Otrzymuję 100% zgodności czyli:
HSV(4, 101, 131);
Kod funkcji wygląda tak:
void RGBToHSV(int r, int g, int b, int &h, int &s, int &v)
{
int cMin = min(r, min(g, b));
int cMax = max(r, min(g, b));
double RDelta, GDelta, BDelta;
v = (((cMax + cMin)*240) + 255 ) / (510);
if (cMax == cMin)
{
s = 0;
h = 160;
}
else
{
if (v < (120))
s = (((cMax - cMin)*240) + ((cMax + cMin) / 2)) / (cMax + cMin);
else
s = (((cMax - cMin)*240) + ((510 - cMax - cMin) / 2)) / (510 - cMax - cMin);
RDelta = (((cMax - r)*(40)) + ((cMax - cMin) / 2)) / (cMax - cMin);
GDelta = (((cMax - g)*(40)) + ((cMax - cMin) / 2)) / (cMax - cMin);
BDelta = (((cMax - b)*(40)) + ((cMax - cMin) / 2)) / (cMax - cMin);
if (r == cMax)
h = BDelta - GDelta;
else
if (g == cMax)
h = (80) + RDelta - BDelta;
else
h = (160) + GDelta - RDelta;
}
}
Bardzo proszę o pomoc.