To Complement Color - CSharp System.Drawing

CSharp examples for System.Drawing:Color

Description

To Complement Color

Demo Code


using System.Windows.Media;
using System.Threading.Tasks;
using System.Text;
using System.Linq;
using System.Collections.Generic;
using System;//from www .  j  av a  2s.com

public class Main{
        public static Color ToComplement(this Color c)
      {
         HSL hsl = c.ToHsl();
         hsl.H += 0.5f;
         if (hsl.H > 1)
            hsl.H -= 1;
         Color ret = hsl.ToColor();
         if (ret == c)
            hsl.L = 1 - hsl.L;
         return hsl.ToColor();
      }
        /// <summary>
      /// Converts a colour from HSL to RGB
      /// </summary>
      /// <remarks>Adapted from the algoritm in Foley and Van-Dam</remarks>
      /// <returns>A Color structure containing the equivalent RGB values</returns>
      public static Color ToColor(this HSL hsl)
      {
         double r = 0, g = 0, b = 0;
         double temp1, temp2;

         if (hsl.L == 0) {
            r = g = b = 0;
         } else {
            if (hsl.S == 0) {
               r = g = b = hsl.L;
            } else {
               temp2 = ((hsl.L <= 0.5) ? hsl.L * (1.0 + hsl.S) : hsl.L + hsl.S - (hsl.L * hsl.S));
               temp1 = 2.0 * hsl.L - temp2;

               double[] t3 = new double[] { hsl.H + 1.0 / 3.0, hsl.H, hsl.H - 1.0 / 3.0 };
               double[] clr = new double[] { 0, 0, 0 };
               for (int i = 0; i < 3; i++) {
                  if (t3[i] < 0)
                     t3[i] += 1.0;
                  if (t3[i] > 1)
                     t3[i] -= 1.0;

                  if (6.0 * t3[i] < 1.0)
                     clr[i] = temp1 + (temp2 - temp1) * t3[i] * 6.0;
                  else if (2.0 * t3[i] < 1.0)
                     clr[i] = temp2;
                  else if (3.0 * t3[i] < 2.0)
                     clr[i] = (temp1 + (temp2 - temp1) * ((2.0 / 3.0) - t3[i]) * 6.0);
                  else
                     clr[i] = temp1;
               }
               r = clr[0];
               g = clr[1];
               b = clr[2];
            }
         }

         return Color.FromRgb((byte)(255 * r), (byte)(255 * g), (byte)(255 * b));

      }
        //
      /// <summary>
      /// Converts RGB to HSL
      /// </summary>
      /// <returns>An HSL value</returns>
      public static HSL ToHsl(this Color c)
      {
         HSL hsl = new HSL();

         hsl.H = c.GetHue() / 360.0; // we store hue as 0-1 as opposed to 0-360
         hsl.L = c.GetBrightness();
         hsl.S = c.GetSaturation();

         return hsl;
      }
}

Related Tutorials