Как преобразовать Hex в RGB?
Я пытаюсь использовать это, чтобы выяснить, светлый или темный цвет
Оцените, является ли значение 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
? Или я просто ушел?
Ответы
Ответ 1
Я пытаюсь использовать это, чтобы выяснить, светлый или темный цвет
Просто используйте Color.GetBrightness()
[изменить]
Я хочу определить, должен ли я использовать белый или черный для моего текста. Итак, ничего ≤.5 Я должен использовать белый и > .5 черный?
Есть номер , чтобы определить, какой цвет использовать на данном фоне, ни один из которых не идеален.
Эта последняя ссылка на самом деле рекомендует использовать только черный/белый, но выбирает точку отсечки 0,73 вместо 0,5. Я думаю, вы должны просто пойти с этим и изменить его, если найдете, что он не работает для вас.
Ответ 2
Просто преобразуйте шестнадцатеричную строку в целое число:
int color = Convert.ToInt32("FFFFFF", 16);
Ответ 3
Вы можете использовать:
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
Ответ 4
Немного о теме, но вот метод расширения для структуры Color, которую я создал, для вычисления Luminance с различными алгоритмами. Надеюсь, это поможет вам.
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
}
}
Ответ 5
Проблема, как я вижу, это ваш расчет rgb
. Вы добавляете значения вместе, что дает вам число от 0 до 3 * 255, что явно не является тем значением, которое ожидает ваш метод. Вам нужно будет рассчитать его следующим образом
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;
который должен быть эквивалентен этому (за исключением альфа-значения, которое вы не используете)
int rgb = color.ToArgb();
Наконец, как вы можете видеть в ответе Криса Хааса, вы можете пропустить этот шаг, преобразовывая непосредственно в int.
Ответ 6
calcLuminance
возвращает только процент.
Ответ 7
Диапазоны R
, G
и B
из Color
struct - 0-255.
Чтобы получить значение rgb, которое вы ожидаете в своей функции, вам нужно будет сдвинуть влево:
int rgb = (int)color.R << 16 + (int)color.G << 8 + color.B;