【问题标题】:Algorithm: Create color from string算法:从字符串创建颜色
【发布时间】:2011-08-16 11:15:49
【问题描述】:

我想从给定的字符串创建一种颜色。字符串不必以任何形式与生成的颜色相关,但相同的字符串应始终生成相同的颜色。

这个问题不受特定编程语言的限制,因此“颜色”应该是与语言无关的格式,如 RGB。

如果该算法创建的颜色范围很广,而不仅仅是灰色,那就太好了。

完全是这样的(C++):

#include <string>

int getRedFromString( std::string givenString )
{ /*Your code here...*/ }

int getGreenFromString( std::string givenString )
{ /*Your code here...*/ }

int getBlueFromString( std::string givenString )
{ /*Your code here...*/ }

int main()
{
    std::string colorString = "FooBar";
    int R = getRedFromString  ( colorString );
    int G = getGreenFromString( colorString );
    int B = getBlueFromString ( colorString );
}

【问题讨论】:

  • 你的问题是什么?您想从字符串创建颜色,但尚未指定任何规则。您是否希望有人来做这项工作,或者您被困在某个地方,不知道从那里去哪里?
  • 那听起来像是功课。 “我想从给定的字符串中创建一种颜色”意味着他是提出这个想法的人,并且应该知道规则是什么。
  • 我目前正在做一个项目,根据他们持有的数据以不同的颜色显示一些 GUI 元素会很好。我只是在征求关于如何做到这一点的建议。有好几个人在回答这个问题,那么您的问题到底是什么?

标签: algorithm colors


【解决方案1】:

获取字符串的哈希,然后使用哈希的前三个字节作为红色、蓝色和绿色值。

【讨论】:

    【解决方案2】:

    您可以使用任何散列算法从字符串中创建一个对于任何给定字符串始终相同的值,并从中获取颜色分量。

    例如,.NET 中的 GetHashCode 方法返回一个整数,因此很容易从中创建一个 RGB 值:

    int RGB = colorString.GetHashCode() & FFFFFFh;
    

    int code = colorString.GetHashCode();
    int B = code & FFh;
    code >>= 8;
    int G = code & FFh;
    code >>= 8;
    int R = code & FFh;
    

    【讨论】:

      【解决方案3】:

      我将尝试在字符串上使用 MD5:

      from hashlib import md5
      
      def get_color_tuple(item)
          hash = md5(item).hexdigest()
          hash_values = (hash[:8], hash[8:16], hash[16:24]) # note: we ignore the values from 24 to 32, but it shouldn't be a problem.
          return tuple(int(value, 16)%256 for value in hash_values)
      

      算法所做的基本上是这样的:它获取前三个 4 字节(即 8 个字符)的块,并以模 256 的元组返回它们,因此它们的范围将在 [0, 255] 内

      【讨论】:

        【解决方案4】:
        #include <string>
        #include <locale>
        
        using namespace std;
        
        int main()
        {
            locale loc;  
            string colorString;
            COLORREF color;
        
            colorString = "FooBar";
        
            const collate<char>& coll = use_facet<collate<char> >(loc);
        
            color = coll.hash(colorString.data(), colorString.data()+ colorString.length());
        }
        

        哈希示例

        【讨论】:

          【解决方案5】:

          您可以计算字符串的哥德尔数。基本上会是 (int)A[0] * 256 ^ n + (int) a[1] * 256 ^ (n-1) .... + (int)A[0]

          与我们的数字系统的想法相同,但使用基数 256,因为有 256 个可能的字符值。

          接下来,只需将要映射到的频谱范围缩小一个因子:

          例如假设你想进入范围 0 ... 2000

          然后只取你得到的任何数字并除以(你范围内的最大数字)/2000

          这种方法的优点是它可以为您提供比 RGB 更广泛的颜色范围。但是,如果您想要 3 原色的简单性,那么您可以只除以 3 并取不同的范围,或者取 mod 3。

          【讨论】:

            【解决方案6】:

            根据您要完成的任务,有多种方法可以做到这一点。最简单的方法是使用 str_stream 将字符串转换为流,并将文本值读取为无符号字符。

            【讨论】:

            • 这会忽略前三个字节之后的所有内容。
            • 仅当您不以任何方式对其进行标记时。
            • 我的假设是颜色是文本,所以非技术人员可以使用它。所以我假设颜色之间至少有一个空间。
            猜你喜欢
            • 1970-01-01
            • 2017-11-30
            • 2020-02-20
            • 1970-01-01
            • 2018-11-15
            • 1970-01-01
            • 2017-07-08
            • 1970-01-01
            • 2019-01-17
            相关资源
            最近更新 更多