public static Color InvertMixedPerceivedLightnessAndValue(Color color, ColorRange range, params double[] filterParams) { double mix = 0.5; if (filterParams.Any()) { mix = filterParams[0].Clamp(0, 1); } var brightness = ColorMath.RgbPerceivedBrightness(color.Red, color.Green, color.Blue); var targetBrightness = (1 - brightness); // using brightness as lightness is not accurate but we can correct this later // how ever it seems that completely correct value produces worse outcome // so we may use something in between var inverted = Color.FromHsl(color.Hue, color.Saturation, targetBrightness, color.Alpha); var rangeFactor = FilterUtils.GetRangeFactor(range, color); var hslFiltered = Color.FromHsl(color.Hue, color.Saturation, targetBrightness, color.Alpha); var hsvFiltered = Color.FromHsv(color.HueHsv, color.SaturationHsv, targetBrightness, color.Alpha); var hsl = color.InterpolateWith(hslFiltered, rangeFactor).Clone(); var hsv = color.InterpolateWith(hsvFiltered, rangeFactor).Clone(); hsl.InterpolateWith(hsv, mix); return(hsl); }
public static Color InvertValue(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); filtered.Value = ColorMath.Invert(color.Value); color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color LevelsValue(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); (double inBlack, double inWhite, double gamma, double outBlack, double outWhite) = FilterUtils.GetLevelsParameters(filterParams); filtered.Value = ColorMath.Levels(color.Value, inBlack, inWhite, gamma, outBlack, outWhite); color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color BrightnessToValue(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); var br = ColorMath.RgbPerceivedBrightness(color.Red, color.Green, color.Blue); filtered.Value = br; color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color ValueToGrayScale(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); filtered.Red = color.Value; filtered.Green = color.Value; filtered.Blue = color.Value; color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color BrightnessToLightness(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); var br = color.GetBrightness(); filtered.Lightness = br; color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color InvertRgb(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var inverted = Color.FromRgb( ColorMath.Invert(color.Red), ColorMath.Invert(color.Green), ColorMath.Invert(color.Blue), color.Alpha); color.InterpolateWith(inverted, rangeFactor); return(color); }
public static Color GainHsvSaturation(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { double gain = (filterParams[0]); filtered.SaturationHsv = (filtered.SaturationHsv * gain); } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color GammaHsvSaturation(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { double gamma = filterParams[0]; filtered.SaturationHsv = ColorMath.Gamma(color.SaturationHsv, gamma); } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color ShiftHslHue(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { double hueShift = filterParams[0]; filtered.Hue = color.Hue + hueShift; } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color GammaBlue(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { double gain = filterParams[0]; filtered.Blue = ColorMath.Gamma(color.Blue, gain); } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color GainLightness(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { double gain = filterParams[0]; filtered.Lightness = (filtered.Lightness * gain); } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color MinValue(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { filtered.Value = color.Value.LimitLow(filterParams[0]); } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color ContrastValue(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { double strength = filterParams[0]; double midpoint = filterParams.Length >= 2 ? filterParams[1] : 0.5; filtered.Value = ColorMath.SSpline(color.Value, strength, midpoint); } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color GammaRgb(Color color, ColorRange colorRange, params double[] filterParams) { if (filterParams.Any()) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); double gamma = filterParams[0]; filtered.Red = ColorMath.Gamma(color.Red, gamma); filtered.Green = ColorMath.Gamma(color.Green, gamma); filtered.Blue = ColorMath.Gamma(color.Blue, gamma); color.InterpolateWith(filtered, rangeFactor); } return(color); }
public static Color MaxHsvSaturation(Color color, ColorRange colorRange, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); if (filterParams.Any()) { filtered.SaturationHsv = color.SaturationHsv.LimitHigh(filterParams[0]); } color.InterpolateWith(filtered, rangeFactor); return(color); }
public static Color InvertPerceivedValue(Color color, ColorRange colorRange = null, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var brightness = ColorMath.RgbPerceivedBrightness(color.Red, color.Green, color.Blue); var targetBrightness = (1 - brightness); // using brightness as lightness is not accurate but we can correct this later // how ever it seems that completely correct value produces worse outcome // so we may use something in between var inverted = Color.FromHsv(color.HueHsv, color.SaturationHsv, targetBrightness, color.Alpha); color.InterpolateWith(inverted, rangeFactor); return(color); }
public static IEnumerable <Color> AutoLevelsRgbByBrightness(IEnumerable <Color> colors, ColorRange range, params double[] filterParams) { List <Color> cache = colors.ToList(); (double inBlack, double inWhite) = FilterUtils.GetLowestAndHighestLightness(cache); IEnumerable <Color> result; if (DegreeOfParallelism > 0) { result = cache .AsParallel() .AsOrdered() .WithDegreeOfParallelism(DegreeOfParallelism); } else { result = cache; } result = result .Select( color => { var rangeFactor = FilterUtils.GetRangeFactor(range, color); var filtered = new Color(color); (double outBlack, double outWhite, double gamma) = FilterUtils.GetAutoLevelParameters(filterParams); filtered.Red = ColorMath.Levels(color.Red, inBlack, inWhite, gamma, outBlack, outWhite); filtered.Green = ColorMath.Levels(color.Green, inBlack, inWhite, gamma, outBlack, outWhite); filtered.Blue = ColorMath.Levels(color.Blue, inBlack, inWhite, gamma, outBlack, outWhite); color.InterpolateWith(filtered, rangeFactor); return(color); } ); foreach (var color in result) { yield return(color); } }
public static IEnumerable <Color> AutoLevelsRgb(IEnumerable <Color> colors, ColorRange colorRange, params double[] filterParams) { // This is to avoid multiple enumeration List <Color> cache = colors.ToList(); (double inBlack, double inWhite) = FilterUtils.GetLowestAndHighestValue(cache); #if DEBUG Console.WriteLine($" (Auto rgb levels - source min {inBlack:F3}, max {inWhite:F3})"); #endif IEnumerable <Color> result; if (DegreeOfParallelism > 0) { result = cache .AsParallel() .AsOrdered() .WithDegreeOfParallelism(DegreeOfParallelism); } else { result = cache; } result = result .Select( color => { var rangeFactor = FilterUtils.GetRangeFactor(colorRange, color); var filtered = new Color(color); (double outBlack, double outWhite, double gamma) = FilterUtils.GetAutoLevelParameters(filterParams); filtered.Red = ColorMath.Levels(color.Red, inBlack, inWhite, gamma, outBlack, outWhite); filtered.Green = ColorMath.Levels(color.Green, inBlack, inWhite, gamma, outBlack, outWhite); filtered.Blue = ColorMath.Levels(color.Blue, inBlack, inWhite, gamma, outBlack, outWhite); color.InterpolateWith(filtered, rangeFactor); return(color); }); foreach (var color in result) { yield return(color); } }
public static Color InvertPerceivedLightnessWithCorrection(Color color, ColorRange range, params double[] filterParams) { var rangeFactor = FilterUtils.GetRangeFactor(range, color); var brightness = ColorMath.RgbPerceivedBrightness(color.Red, color.Green, color.Blue); var targetBrightness = (1 - brightness); // using brightness as lightness is not accurate but we can correct this later // how ever it seems that completely correct value produces worse outcome // so we may use something in between var inverted = Color.FromHsl(color.Hue, color.Saturation, targetBrightness, color.Alpha); var newBrightness = ColorMath.RgbPerceivedBrightness(inverted.Red, inverted.Green, inverted.Blue); //var delta = targetBrightness / newBrightness - 1; var corr = targetBrightness / newBrightness + (targetBrightness / newBrightness - 1); // / 4; if (filterParams.Any()) { corr = ColorMath.LinearInterpolation(filterParams[0], 0, 1, 1, corr); } else { corr = 1; } double r = inverted.Red * corr; double g = inverted.Green * corr; double b = inverted.Blue * corr; var corrected = Color.FromRgb(r, g, b, color.Alpha); // var correctedBrightness = ColorMath.RgbPerceivedBrightness(corrected.Red, // corrected.Green, corrected.Blue); color.InterpolateWith(corrected, rangeFactor); return(color); }
public static Color InvertMixedLightnessAndValue(Color color, ColorRange range, params double[] filterParams) { double mix = 0.5; if (filterParams.Any()) { mix = filterParams[0].Clamp(0, 1); } var rangeFactor = FilterUtils.GetRangeFactor(range, color); var hslFiltered = new Color(color); var hsvFiltered = new Color(color); hslFiltered.Lightness = ColorMath.Invert(color.Lightness); hsvFiltered.Value = ColorMath.Invert(color.Value); var hsl = color.InterpolateWith(hslFiltered, rangeFactor).Clone(); var hsv = color.InterpolateWith(hsvFiltered, rangeFactor).Clone(); hsl.InterpolateWith(hsv, mix); return(hsl); }