J'essaie de l'utiliser pour déterminer si une couleur est claire ou sombre
Évaluez si une valeur HEX est sombre ou claire
À présent. Il faut dans une int
float calcLuminance(int rgb)
{
int r = (rgb & 0xff0000) >> 16;
int g = (rgb & 0xff00) >> 8;
int b = (rgb & 0xff);
return (r*0.299f + g*0.587f + b*0.114f) / 256;
}
J'ai une couleur hexagonale cependant.
J'ai essayé de faire ça
var color = System.Drawing.ColorTranslator.FromHtml("#FFFFFF");
int rgb = color.R + color.G + color.B;
var a = calcLuminance(rgb);
J'ai obtenu 0,11725. Je pensais qu'il faudrait que ce soit dans la fourchette 0-256 ou quelque chose comme ça.
Qu'est-ce que je fais mal? Dois-je convertir R
en int
? Ou suis-je juste loin?
J'essaie de l'utiliser pour déterminer si une couleur est claire ou sombre
Il suffit d'utiliser Color.GetBrightness()
[Modifier]
Je veux déterminer si je dois utiliser du blanc ou du noir pour mon texte. Donc, quoi que ce soit ≤ 0,5 je devrais utiliser du blanc et> 0,5 noir?
Il y a un nombredefaçons pour déterminer quelle couleur utiliser sur un fond donné, aucune d'entre elles n'est parfaite.
Ce dernier lien recommande en fait d'utiliser uniquement le noir et blanc, mais de choisir un point de coupure de 0,73 au lieu de 0,5. Je pense que vous devriez simplement y aller et le changer si vous trouvez que cela ne fonctionne pas pour vous.
Il suffit de convertir la chaîne hexadécimale en un entier:
int color = Convert.ToInt32("FFFFFF", 16);
Vous pouvez utiliser:
public string GenerateRgba(string backgroundColor, decimal backgroundOpacity)
{
Color color = ColorTranslator.FromHtml(hexBackgroundColor);
int r = Convert.ToInt16(color.R);
int g = Convert.ToInt16(color.G);
int b = Convert.ToInt16(color.B);
return string.Format("rgba({0}, {1}, {2}, {3});", r, g, b, backgroundOpacity);
}
Un peu de sujet, mais voici une méthode d'extension à la structure Color que j'ai créée pour calculer la luminance avec différents algorithmes. J'espère que ça vous aide.
public static class ColorExtensions
{
/// <summary>
/// Gets the luminance of the color. A value between 0 (black) and 1 (white)
/// </summary>
/// <param name="color">The color.</param>
/// <param name="algorithm">The type of luminance alg to use.</param>
/// <returns>A value between 0 (black) and 1 (white)</returns>
public static double GetLuminance(this Color color, LuminanceAlgorithm algorithm = LuminanceAlgorithm.Photometric)
{
switch (algorithm)
{
case LuminanceAlgorithm.CCIR601:
return (0.2126 * color.R + 0.7152 * color.G + 0.0722 * color.B) / 255;
case LuminanceAlgorithm.Perceived:
return (Math.Sqrt(0.241 * Math.Pow(color.R, 2) + 0.691 * Math.Pow(color.G, 2) + 0.068 * Math.Pow(color.B, 2)) / 255);
case LuminanceAlgorithm.Photometric:
return (0.299 * color.R + 0.587 * color.G + 0.114 * color.B) / 255;
}
}
/// <summary>
/// The luminances
/// </summary>
public enum LuminanceAlgorithm
{
/// <summary>
/// Photometric/digital ITU-R
/// </summary>
Photometric,
/// <summary>
/// Digital CCIR601 (gives more weight to the R and B components, as preciev by the human eye)
/// </summary>
CCIR601,
/// <summary>
/// A perceived luminance
/// </summary>
Perceived
}
}
Le problème, à mon avis, est votre calcul de rgb
. Vous additionnez les valeurs, ce qui vous donne un nombre compris entre 0 et 3 * 255, ce qui n'est clairement pas la valeur attendue par votre méthode. Vous devrez le calculer comme ça
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
qui devrait être équivalent à ceci (sauf pour la valeur alpha que vous n'utilisez pas)
int rgb = color.ToArgb();
Enfin, comme vous pouvez le voir dans la réponse de Chris Haas, vous pouvez ignorer cette étape en convertissant directement en int.
calcLuminance
ne renvoie qu'un pourcentage.
Les plages de R
, G
et B
de Color
struct sont comprises entre 0 et 255.
Pour obtenir la valeur rgb que vous attendez dans votre fonction, vous devez déplacer à gauche en conséquence:
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;