Rozumiem że takie operacje wykonuje się na liczbach. Jeżeli obraz zapisany jest w systemie RGB to operacje wykonujemy na 3 skłaowych R(0-255), G(0-255) i B(0-255).
To przykład zmiany kontrastu na obrazie którego kolory są kodowane w systemie RGB:
void Kontrast(Graphics::TBitmap OBRAZ, int kontrast)
{
double V = 1.2725kontrast;
double V1 = 255/(255-2V);
double V2 = (255+2V)/255;
int x1 = 0;
int x2 = OBRAZ->Width;
for( x1; x1 < x2; x1++ )
{
int y1 = 0;
int y2 = OBRAZ->Height;
for( y1; y1 < y2; y1++ )
{
//pobierz kolor piksela i wyodrębnij 3 skladowe RGB
//po wyodrębnieniu odwró kolor
int R = (OBRAZ->Canvas->Pixels[x1][y1] & 0xFF);
int G = (OBRAZ->Canvas->Pixels[x1][y1] & 0xFF00) >> 8;
int B = (OBRAZ->Canvas->Pixels[x1][y1] & 0xFF0000) >> 16;
//zmodyfikuj składowe r,g,b
if( V > 0 )
{
R = (R < V)?0: (R > 255-V)?255: V1*(R-V);
G = (G < V)?0: (G > 255-V)?255: V1*(G-V);
B = (B < V)?0: (B > 255-V)?255: V1*(B-V);
}
else if( V < 0 )
{
R = -V + V2*R;
G = -V + V2*G;
B = -V + V2*B;
}
//sprawdź zakresy
R = (R > 255)?255: (R < 0)?0: R;
G = (G > 255)?255: (G < 0)?0: G;
B = (B > 255)?255: (B < 0)?0: B;
//zapisz nowy kolor piksela na OBRAZ
OBRAZ->Canvas->Pixels[x1][y1] = (TColor)RGB(R,G,B);
}
}
}
Ale co zrobić gdy kolor na obrazie jest kodowany za pomocą systemu HSL lub HSV. Wtedy operacje będziemy przeprowadzać na liczbach H(0-360), S(0-1), L(0-1) lub V(0-1). Tylko jakie te operacje należy wykonać ?? Czy ktoś posiada algorytm zmiany kontrastu na składowych w tych systemach ??