我试图用这个来弄清楚颜色是浅还是暗
Evaluate whether a HEX value is dark or light
现在。它需要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;
}
虽然我有一个十六进制颜色。
我试图这样做
var color = System.Drawing.ColorTranslator.FromHtml("#FFFFFF");
int rgb = color.R + color.G + color.B;
var a = calcLuminance(rgb);
我得到0.11725我认为它必须在0-256之间或类似的东西。
我做错了什么?我是否必须将R
转换为int
?或者我离开了?
答案 0 :(得分:20)
只需将十六进制字符串转换为整数:
int color = Convert.ToInt32("FFFFFF", 16);
答案 1 :(得分:9)
即可我试图用这个来弄清楚颜色是浅还是暗
<强> [编辑] 强>
我想确定是否应该在文字中使用白色或黑色。所以≤5我应该使用白色和&gt; .5黑色?
有一个number of ways来确定在给定背景上使用的颜色,其中没有一种是完美的。
最后一个链接实际上建议仅使用黑/白,但选择0.73而不是0.5的截止点。我认为你应该选择它,如果你觉得它不适合你就改变它。
答案 2 :(得分:9)
您可以使用:
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);
}
答案 3 :(得分:3)
一些主题,但这里是我为使用不同算法计算Luminance而创建的Color结构的扩展方法。希望它可以帮到你。
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
}
}
答案 4 :(得分:2)
正如我所看到的,问题是你对rgb
的计算。您可以将这些值一起添加到0到3 * 255之间的数字,这显然不是您的方法所期望的值。你必须像这样计算它
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
应该相当于此(除了你不使用的alpha值)
int rgb = color.ToArgb();
最后,正如您在Chris Haas的回答中所看到的,您可以通过直接转换为int来跳过此步骤。
答案 5 :(得分:1)
calcLuminance
只返回一个百分比。
答案 6 :(得分:0)
Color
结构中R
,G
和B
的范围是0-255。
要获得您在函数中所期望的rgb值,您需要相应地左移:
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
答案 7 :(得分:0)
您的想法还可以,但您的功能有误,正确的方法在这里:
int rgb = Convert.ToInt32("#FFFFFF", 16);
var a = calcLuminance(rgb);
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;
}