static int Hue(FastBitmap.MyColor col, int depth) { int max = Math.Max(col.R, Math.Max(col.G, col.B)); int min = Math.Min(col.R, Math.Min(col.G, col.B)); if (min == max) { return(180); } int result; if (max == col.R) { result = 60 * (col.G - col.B) / (max - min); if (col.G < col.B) { result += 360; } } else if (max == col.G) { result = 60 * (col.B - col.R) / (max - min) + 120; } else { result = 60 * (col.R - col.G) / (max - min) + 240; } result = (result + depth * 360 / scrollRange + 190) % 360; return(result); }
static void HSV(FastBitmap.MyColor dst, int H, double S, double V) { int Hi = (H / 60) % 6; double Vmin = (100 - S) * V / 100; double a = (V - Vmin) * (H % 60) / 60; byte Vinc = (byte)Math.Round((Vmin + a) * 255 / 100); byte Vdec = (byte)Math.Round((V - a) * 255 / 100); byte iVmin = (byte)Math.Round(Vmin * 255 / 100); byte iV = (byte)Math.Round(V * 255 / 100); switch (Hi) { case (0): dst.Set(iV, Vinc, iVmin); return; case (1): dst.Set(Vdec, iV, iVmin); return; case (2): dst.Set(iVmin, iV, Vinc); return; case (3): dst.Set(iVmin, Vdec, iV); return; case (4): dst.Set(Vinc, iVmin, iV); return; case (5): dst.Set(iV, iVmin, Vdec); return; } }
static double Saturation(FastBitmap.MyColor col, int depth) { int max = Math.Max(col.R, Math.Max(col.G, col.B)); int min = Math.Min(col.R, Math.Min(col.G, col.B)); if (max == 0) { return(0); } double result = (max - min) * 100 / (double)max; return(Scale(result, depth)); }
static void HSVColor(FastBitmap.MyColor src, FastBitmap.MyColor dst, int h, int s, int v) { HSV(dst, Hue(src, h), Saturation(src, s), Value(src, v)); }
static void ValueColor(FastBitmap.MyColor src, FastBitmap.MyColor dst, int depth) { byte res = (byte)Math.Round(Value(src, depth) * 255 / 100); dst.Set(res, res, res); }
static void SaturationColor(FastBitmap.MyColor src, FastBitmap.MyColor dst, int depth) { byte res = (byte)Math.Round(Saturation(src, depth) * 255 / 100); dst.Set(res, res, res); }
static void HueColor(FastBitmap.MyColor src, FastBitmap.MyColor dst, int depth) { HSV(dst, Hue(src, depth), 100, 100); }
static double Value(FastBitmap.MyColor col, int depth) { double result = Math.Max(col.R, Math.Max(col.G, col.B)) * 100 / (double)255; return(Scale(result, depth)); }