C#: Create a lighter/darker color based on a system color

前端 未结 11 1393
春和景丽
春和景丽 2020-12-07 18:26

Duplicate

How do I adjust the brightness of a color?
How do I determine darker or lighter color variant of a given color?
Programmat

相关标签:
11条回答
  • 2020-12-07 18:54

    I recently blogged about this. The main idea is to apply a given correction factor to each of the color components. The following static method modifies the brightness of a given color with a specified correction factor and produces a darker or a lighter variant of that color:

    /// <summary>
    /// Creates color with corrected brightness.
    /// </summary>
    /// <param name="color">Color to correct.</param>
    /// <param name="correctionFactor">The brightness correction factor. Must be between -1 and 1. 
    /// Negative values produce darker colors.</param>
    /// <returns>
    /// Corrected <see cref="Color"/> structure.
    /// </returns>
    public static Color ChangeColorBrightness(Color color, float correctionFactor)
    {
        float red = (float)color.R;
        float green = (float)color.G;
        float blue = (float)color.B;
    
        if (correctionFactor < 0)
        {
            correctionFactor = 1 + correctionFactor;
            red *= correctionFactor;
            green *= correctionFactor;
            blue *= correctionFactor;
        }
        else
        {
            red = (255 - red) * correctionFactor + red;
            green = (255 - green) * correctionFactor + green;
            blue = (255 - blue) * correctionFactor + blue;
        }
    
        return Color.FromArgb(color.A, (int)red, (int)green, (int)blue);
    }
    
    0 讨论(0)
  • 2020-12-07 18:54

    You can also do this using a Lerp function. There's one in XNA, but it's easy to write yourself.

    See my answer to this similar question for a C# implementation.

    The function lets you do this:

    // make red 50% lighter:
    Color.Red.Lerp( Color.White, 0.5 );
    
    // make red 75% darker:
    Color.Red.Lerp( Color.Black, 0.75 );
    
    // make white 10% bluer:
    Color.White.Lerp( Color.Blue, 0.1 );
    
    0 讨论(0)
  • 2020-12-07 18:55

    Most of these methods do darken the color but they adjust the hue way to much so the result doesn't look very good. The best answer is to use Rich Newman's HSLColor class and adjust the luminosity.

    public Color Darken(Color color, double darkenAmount) {
        HSLColor hslColor = new HSLColor(color);
        hslColor.Luminosity *= darkenAmount; // 0 to 1
        return hslColor;
    }
    
    0 讨论(0)
  • 2020-12-07 18:57

    Using HSI converter library(search google). And then, adjust I channel for lighter/darker color.

    0 讨论(0)
  • 2020-12-07 18:59

    ControlPaint.Light .Dark .DarkDark, etc.

    Color lightRed = ControlPaint.Light( Color.Red );
    
    0 讨论(0)
  • 2020-12-07 19:01

    Here's some javascript code I use for lightening/darkening a given colour. You could use it as a base for an equivalent C# function

    It works by calculating a distance from pure white of each of the RGB components and then adjusts this distance by the provided factor. The new distance is used to calculate the new colour. A factor of between 0 and 1 darkens, a factor higher than 1 lightens

    function Darken( hexColor, factor )
        {   
            if ( factor < 0 ) factor = 0;
    
            var c = hexColor;
            if ( c.substr(0,1) == "#" )
            {
                c = c.substring(1);
            }
    
            if ( c.length == 3 || c.length == 6 )
            {
                var i = c.length / 3;
    
                var f;  // the relative distance from white
    
                var r = parseInt( c.substr(0, i ), 16 );
                f = ( factor * r / (256-r) );
                r = Math.floor((256 * f) / (f+1));
    
                r = r.toString(16);
                if ( r.length == 1 ) r = "0" + r;
    
                var g = parseInt( c.substr(i, i), 16);
                f = ( factor * g / (256-g) );
                g = Math.floor((256 * f) / (f+1));
                g = g.toString(16);
                if ( g.length == 1 ) g = "0" + g;
    
                var b = parseInt( c.substr( 2*i, i),16 );
                f = ( factor * b / (256-b) );
                b = Math.floor((256 * f) / (f+1));
                b = b.toString(16);
                if ( b.length == 1 ) b = "0" + b;
    
                c =  r+g+b;
             }   
    
             return "#" + c;
    
        }
    
    0 讨论(0)
提交回复
热议问题