如何将十六进制转换为RGB

本文关键字:RGB 转换 十六进制 | 更新日期: 2023-09-27 17:51:24

我想用这个来找出一个颜色是浅的还是深的

计算HEX值是暗的还是亮的

。它吸收了一个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;
 }

我有一个十六进制颜色。

I tried to do this

  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吗?还是我说错了?

如何将十六进制转换为RGB

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

int color = Convert.ToInt32("FFFFFF", 16);

您可以使用:

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

链接到jeremy clifton在git上的原创文章

我想用这个来找出一个颜色是浅的还是深的

直接用Color.GetBrightness()


[编辑]

我想确定文本应该使用白色还是黑色。所以任何≤。5的我都应该用白色>。5的黑色?

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

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

有点主题,但这里是我创建的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
   }
}

问题,在我看来,是你的rgb的计算。你把这些值加在一起,得到一个0到3*255之间的数字,这显然不是你的方法所期望的值。你必须这样计算

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

应该等于this(除了你不使用的alpha值)

int rgb = color.ToArgb();

最后,正如您在Chris Haas的回答中看到的那样,您可以通过直接转换为int来跳过这一步。

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

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

Color结构体中的RGB的取值范围为0-255。

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

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

calcLuminance只返回一个百分比。

您也可以将HEX转换为RGB 而不使用System。用this:

绘制
 int RGBint = Convert.ToInt32("FFD700", 16);
 byte Red = (byte)((RGBint >> 16) & 255);
 byte Green = (byte)((RGBint >> 8) & 255);
 byte Blue = (byte)(RGBint & 255);
 //Color.FromRgb(Red, Green, Blue);