根据十六进制字符串/二进制数的相似度判断颜色

Determine color based on similarity of hexadecimal string / binary number

这个问题看起来很奇怪。

我在 YouTube 视频中遇到过它,其中对象具有字符串属性。 对象的图形表示根据字符串的相似性着色。

该字符串被定义为二进制数的十六进制表示形式。例如“915BB352”表示“10010001010110111011001101010010”。

我可以在 C# 中使用什么方法来获得这种行为?

所以“10010001010110111011001101010010”和“10010001010110111011001101010000”应该有相似的颜色。 “10010001010110111011001101010010”和“01100100110001101010100001011111”应该完全不同。

而不是使用十六进制或二进制,尝试将十六进制颜色转换为 HSL 然后您可以使用 HSL 来确定差异,只需测量 Hue 中的差异,然后比较 Lightness 和最后Saturation

Red: hsla(360, 100%, 50%, 1) Blue: hsla(250, 100%, 50%, 1)

区别是:

(360 - 250), (100% - 100%), ( 50% - %50%), (1-1)

差等于: = 10, 0, 0, 0

这是完全不同的

定义

HSL(用于色调、饱和度、亮度)和 HSV(用于色调、饱和度、明度;也称为 HSB,用于色调、饱和度、亮度)是 RGB 颜色模型的替代表示法,由 1970 年代设计计算机图形学研究人员更接近人类视觉感知颜色制作属性的方式。

public static HSLColor FromRGB(Byte R, Byte G, Byte B)
    {
        float _R = (R / 255f);
        float _G = (G / 255f);
        float _B = (B / 255f);

        float _Min = Math.Min(Math.Min(_R, _G), _B);
        float _Max = Math.Max(Math.Max(_R, _G), _B);
        float _Delta = _Max - _Min;

        float H = 0;
        float S = 0;
        float L = (float)((_Max + _Min) / 2.0f);

        if (_Delta != 0)
        {
            if (L < 0.5f)
            {
                S = (float)(_Delta / (_Max + _Min));
            }
            else
            {
                S = (float)(_Delta / (2.0f - _Max - _Min));
            }


            if (_R == _Max)
            {
                H = (_G - _B) / _Delta;
            }
            else if (_G == _Max)
            {
                H = 2f + (_B - _R) / _Delta;
            }
            else if (_B == _Max)
            {
                H = 4f + (_R - _G) / _Delta;
            }
        }

        return new HSLColor(H, S, L);
    }

你可以玩HSL Here