C#: créer une couleur plus claire / plus foncée basée sur une couleur système

Dupliquer

comment ajuster la luminosité d'une couleur?

Comment puis-je déterminer la variante de couleur plus foncée ou plus claire d'une couleur donnée?

éclairer Programmatically une couleur


Dire que j'ai

var c = Color.Red;

maintenant je veux créer un nouveau Color qui est plus clair ou plus foncé que cette couleur. Comment puis-je faire ça sans trop de tracas?

51
demandé sur Community 2009-04-29 12:19:45

11 réponses

ControlPaint .Lumière. Sombre. DarkDark, etc.

Color lightRed = ControlPaint.Light( Color.Red );
88
répondu Paul Alexander 2009-04-29 08:32:32

j'ai récemment blogué à propos de cette . L'idée principale est d'appliquer un facteur de correction pour chaque composante de couleur. La méthode statique suivante modifie la luminosité d'une couleur donnée avec un facteur de correction spécifié et produit une variante plus foncée ou plus légère de cette couleur:

/// <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);
}
64
répondu Pavel Vladov 2017-01-27 20:23:38

vous pouvez également le faire en utilisant une fonction Lerp . Il y en a un à XNA, mais c'est facile de s'écrire.

Voir ma réponse à cette question semblable pour un C# de mise en œuvre.

la fonction vous permet de faire ceci:

// 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 );
12
répondu Keith 2017-05-23 11:54:48

la plupart de ces méthodes assombrissent la couleur, mais ils ajustent la teinte à beaucoup de sorte que le résultat ne semble pas très bon. La meilleure réponse est d'utiliser la classe Rich Newman's HSLColor et d'ajuster la luminosité.

public Color Darken(Color color, double darkenAmount) {
    HSLColor hslColor = new HSLColor(color);
    hslColor.Luminosity *= darkenAmount; // 0 to 1
    return hslColor;
}
7
répondu TugboatCaptain 2017-05-23 11:47:16

voici du code javascript que j'utilise pour éclairer/assombrir une couleur donnée. Vous pouvez l'utiliser comme base pour une fonction C# équivalente

il fonctionne en calculant une distance à partir du blanc pur de chacun des composants RVB et ajuste ensuite cette distance par le facteur fourni. La nouvelle distance est utilisée pour calculer la nouvelle couleur. Un facteur compris entre 0 et 1 s'obscurcit, un facteur supérieur à 1 s'éclaircit

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;

    }
4
répondu Tom Carter 2009-04-29 08:42:10

prenant la méthode de base de réponse de @Pavel j'ai préparé les deux petites méthodes d'extension suivantes pour une signature plus intuitive (au moins pour moi).

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); 
}
3
répondu Zoltán Tamási 2017-05-23 12:10:32

vous pouvez aussi simplement travailler sur le pourcentage RVB pour l'obtenir plus clair ou plus sombre que vous voulez, voici un exemple pour la façon de faire une couleur plus sombre x% qu'il ne l'est:

//_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));
    }

une chose de plus nous pouvons également inverser le processus pour être plus léger à la place, seulement nous obtenons le résultat de 255-RGB et puis le multiplier par le pourcentage que nous voulons comme l'exemple suivant:

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))
            );
    }

Espère que ça aide.

1
répondu Omar Negm 2016-06-20 21:53:39

j'ai changé la fonction Pavel Vladov pour modifier même le composant RVB, pour obtenir des nuances sur n'importe quelle combinaison de directions R/G/B:

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
1
répondu Tratak 2018-01-08 12:44:25

en utilisant HSI converter library(recherchez google). Et puis, ajuster mon canal pour une couleur plus claire/plus foncée.

0
répondu Soul_Master 2009-04-29 08:26:04

regardez la classe ControlPaint:

MSDN: les Membres de ControlPaint

0
répondu Homes2001 2009-04-29 08:31:25

j'ai fait un site qui fait ce colorglower.com vous pouvez le vérifier pour voir une démo.

voici le code javascript que j'ai utilisé.

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;

}

ce que ce code fait est il reçoit une couleur hexadécimale et puis il sort 10 versions les plus claires de couleur de lui et met dans le tableau. Vous pouvez changer la luminosité à ce que vous voulez pour ajuster le pourcentage d'ombre. Pour assombrir les couleurs, vous avez juste besoin à modifier:

luminosity -= calcPercentage();
0
répondu shinra tensei 2017-01-04 13:50:53