Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
        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);
        }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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);
        }
Esempio n. 11
0
        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);
        }
Esempio n. 12
0
        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);
        }
Esempio n. 13
0
        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);
        }
Esempio n. 14
0
        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);
        }
Esempio n. 15
0
        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);
        }
Esempio n. 16
0
        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);
        }
Esempio n. 17
0
        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);
        }
Esempio n. 18
0
        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);
            }
        }
Esempio n. 19
0
        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);
            }
        }
Esempio n. 20
0
        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);
        }
Esempio n. 21
0
        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);
        }