Как преобразовать Hex в RGB? - PullRequest
18 голосов
/ 20 апреля 2011

Я пытаюсь использовать это, чтобы выяснить, является ли цвет светлым или темным

Оценить, является ли значение 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;
 }

У меня есть шестнадцатеричный цвет, хотя.

Я пытался сделать это

  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?Или я просто далеко?

Ответы [ 7 ]

20 голосов
/ 21 апреля 2011

Просто преобразуйте шестнадцатеричную строку в целое число:

int color = Convert.ToInt32("FFFFFF", 16);
9 голосов
/ 30 июля 2015

Вы можете использовать:

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

Ссылка на оригинальное сообщение Джереми Клифтона на Git

9 голосов
/ 21 апреля 2011

Я пытаюсь использовать это, чтобы выяснить, является ли цвет светлым или темным

Просто используйте Color.GetBrightness()


[Изменить]

Я хочу определить, должен ли я использовать белый или черный для своего текста. Так что-нибудь ≤ .5 я должен использовать белый и> .5 черный?

Существует число из способов , чтобы определить, какой цвет использовать на заданном фоне, ни один из которых не является идеальным.

Эта последняя ссылка на самом деле рекомендует использовать только черный / белый, но выбирая точку среза 0,73 вместо 0,5. Я думаю, вы должны просто пойти с этим и изменить его, если вы обнаружите, что он не работает для вас.

3 голосов
/ 21 апреля 2011

Немного о теме, но вот метод расширения структуры 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
   }
}
2 голосов
/ 21 апреля 2011

Проблема, на мой взгляд, в том, что вы вычислили rgb. Вы складываете вместе значения, которые дают число от 0 до 3 * 255, что явно не соответствует ожидаемому вами методу. Вы должны будете рассчитать это так

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

, что должно быть эквивалентно этому (за исключением альфа-значения, которое вы не используете)

int rgb = color.ToArgb();

Наконец, как вы можете видеть в ответе Криса Хааса, вы можете пропустить этот шаг, преобразовав непосредственно в int.

1 голос
/ 21 апреля 2011

calcLuminance возвращает только проценты.

0 голосов
/ 20 апреля 2011

Диапазоны R, G и B из структуры Color составляют 0-255.

Чтобы получить значение rgb, ожидаемое в вашемфункции, вам нужно будет сдвинуть влево соответственно:

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