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

前端 未结 11 1394
春和景丽
春和景丽 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 19:04

    Taking the core method of @Pavel's answer I prepared the following two little extension methods for a more intuitive (at least for me) signature.

    public static Color LightenBy(this Color color, int percent)
    {
        return ChangeColorBrightness(color, percent/100.0);
    }
    
    public static Color DarkenBy(this Color color, int percent)
    {
        return ChangeColorBrightness(color, -1 * percent / 100.0); 
    }
    
    0 讨论(0)
  • 2020-12-07 19:07

    I made a site that does this colorglower.com You can check it out to see a demo.

    Here's the javascript code i used.

    function lighten(color) {
    
    // convert to decimal and change luminosity
    var luminosity = 0.01
    var computedColors = new Array();
    var newColor = "#",
        c, i, n, black = 0,
        white = 255;
    for (n = 0; n < 10; n++) {
        for (i = 0; i < 3; i++) {
            c = parseInt(color.substr(i * 2, 2), 16);
            c = Math.round(Math.min(Math.max(black, c + (luminosity * white)), white)).toString(16);
            newColor += ("00" + c).substr(c.length);
        }
    
        computedColors[n] = newColor;
        var arrayUnique = checkIfArrayIsUnique(computedColors);
        if (arrayUnique == false) {
            computedColors.pop();
            break;
        }
    
        computedColors[n] = newColor;
        newColor = "#";
        luminosity += calcPercentage();
    }
    
    return computedColors;
    

    }

    What this code does is it receives a hex color and then it outputs 10 lightest color versions of it and puts in in the array. You can change the luminosity to whatever you like to adjust the shade percentage. To darken the colors you just need to change:

    luminosity -= calcPercentage();
    
    0 讨论(0)
  • 2020-12-07 19:09

    I changed Pavel Vladov function to modify even RGB component, to get shades on any combination of R/G/B directions:

    Public Function ChangeColorShades(color As Color, correctionFactor As Single, bR As Boolean, bG As Boolean, bB As Boolean) As Color
    
    
        Dim red As Single = CSng(color.R)
        Dim green As Single = CSng(color.G)
        Dim blue As Single = CSng(color.B)
    
        If (correctionFactor < 0) Then
    
            correctionFactor = 1 + correctionFactor
            If bR Then
                red *= correctionFactor
            End If
            If bG Then
                green *= correctionFactor
            End If
            If bB Then
                blue *= correctionFactor
            End If
    
    
        Else
            If bR Then
                red = (255 - red) * correctionFactor + red
            End If
            If bG Then
                green = (255 - green) * correctionFactor + green
            End If
            If bB Then
                blue = (255 - blue) * correctionFactor + blue
            End If
    
        End If
    
        Return color.FromArgb(color.A, CInt(red), CInt(green), CInt(blue))
    End Function
    
    0 讨论(0)
  • 2020-12-07 19:10

    You can also simply work on the RGB percentage to get it lighter or darker as you want, Here is an example for how to make a color darker x% than it is:

    //_correctionfactory in percentage, e.g 50 = make it darker 50%
        private Color DarkerColor(Color color, float correctionfactory = 50f)
        {
            const float hundredpercent = 100f;                        
            return Color.FromArgb((int)(((float)color.R / hundredpercent) * correctionfactory),
                (int)(((float)color.G / hundredpercent) * correctionfactory), (int)(((float)color.B / hundredpercent) * correctionfactory));
        }
    

    One more thing we can also reverse the process to be lighter instead, Only we getting the result of 255 - RGB and then multiply it by the percentage we want like the following example:

    private Color LighterColor(Color color, float correctionfactory = 50f)
        {
            correctionfactory = correctionfactory / 100f;
            const float rgb255 = 255f;
            return Color.FromArgb((int)((float)color.R + ((rgb255 - (float)color.R) * correctionfactory)), (int)((float)color.G + ((rgb255 - (float)color.G) * correctionfactory)), (int)((float)color.B + ((rgb255 - (float)color.B) * correctionfactory))
                );
        }
    

    Hope that helps.

    0 讨论(0)
  • 2020-12-07 19:12

    Take a look at the ControlPaint class:

    MSDN: Members of ControlPaint

    0 讨论(0)
提交回复
热议问题