C# 如何将十六进制转换为RGB?

C# 如何将十六进制转换为RGB?,c#,.net,colors,hex,rgb,C#,.net,Colors,Hex,Rgb,我试着用这个来判断一种颜色是亮的还是暗的 现在。它接受一个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; }

我试着用这个来判断一种颜色是亮的还是暗的

现在。它接受一个
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
?或者说我离这太远了?

结构的
R
G
B
的范围是0-255

要获得函数中预期的rgb值,需要相应地左移:

int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;

intrgb=(int)color.R在我看来,问题在于如何计算
rgb
。将这些值相加,得到一个介于0和3*255之间的数字,这显然不是方法所期望的值。你必须这样计算

int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;

最后,正如您在Chris Haas answer中看到的,您可以通过直接转换为整数跳过这一步。

CalClunInance
只返回一个百分比。

只需将十六进制字符串转换为整数:

int color = Convert.ToInt32("FFFFFF", 16);
我试着用这个来判断一种颜色是亮的还是暗的

只用


[编辑]

我想确定我的文本应该使用白色还是黑色。什么都可以≤ .5我应该使用白色和>0.5黑色

在给定的背景上,有很多方法可以决定使用什么颜色,但没有一种是完美的


最后一个链接实际上建议只使用黑/白,但选择0.73而不是0.5的截止点。我认为你应该这样做,如果你发现它不适合你,就改变它。

这是一个小主题,但这里是我创建的颜色结构的一个扩展方法,用不同的算法计算亮度。希望对你有帮助

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
   }
}
公共静态类扩展
{
/// 
///获取颜色的亮度。值介于0(黑色)和1(白色)之间
/// 
///颜色。
///要使用的亮度alg的类型。
///介于0(黑色)和1(白色)之间的值
public static double GetLuminance(此颜色,亮度算法=亮度算法.光度)
{
开关(算法)
{
案例亮度算法.CCIR601:
返回值(0.2126*color.R+0.7152*color.G+0.0722*color.B)/255;
案例亮度算法。感知:
返回(Math.Sqrt(0.241*Math.Pow(color.R,2)+0.691*Math.Pow(color.G,2)+0.068*Math.Pow(color.B,2))/255);
案例亮度算法。光度控制:
返回值(0.299*color.R+0.587*color.G+0.114*color.B)/255;
}
}
/// 
///亮度
/// 
公共枚举亮度算法
{
/// 
///光度/数字ITU-R
/// 
光度,
/// 
///数字CCIR601(赋予R和B分量更大的权重,如人眼所精确)
/// 
CCIR601,
/// 
///可感知的亮度
/// 
感知
}
}
您可以使用:

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

您的想法是正确的,但您的功能是错误的,正确的功能在这里:

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

哎呀,我把这个投了高票,因为我误读了这个问题。他实际上并不是在问“如何从十六进制转换为RGB”——他真正想知道的是如何获得RGB颜色的亮度(亮度)。他有两个不同的潜在问题。“如何做x”和“有比x更好的方法吗?”。我回答了第一个,你回答了第二个@BlueRaja-Danny Pflughoeft-类似于这个System.Drawing.Color someColor=System.Drawing.Color.FromArgb(Color.R,Color.G,Color.B);float ab=someColor.GetBrightness();在不首先将其转换为rgb的情况下,是否仍然可以执行此操作?@chobo2 Just
float ab=System.Drawing.ColorTranslator.FromHtml(“#ffffffff”).GetBrightness():)@Chobo:那你是怎么把颜色输入电脑的?您给出的示例是RGB:在
“#FFFFFF”
中,第一个
“FF”
是R(十六进制),第二个
“FF”
是G,第三个
“FF”
是B。正如@lassespeholt在上面的注释中所述,您可以在一行中从RGB字符串获得亮度。@lassespeholt-Cool。所以我想确定我的文本应该使用白色还是黑色。所以任何小于等于.5的东西我都应该使用白色,如果大于.5,我应该使用黑色?亮度和亮度不是一回事。我使用亮度来确定颜色是暗还是亮得到了更好的结果
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;
}