算法:从字符串创建颜色

时间:2011-05-01 13:53:57

标签: algorithm colors

我想从给定的字符串创建颜色。该字符串不必与任何形式的结果颜色相关,但相同的字符串应始终产生相同的颜色。

此问题不受特定编程语言的约束,因此“颜色”应采用与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 );
}

6 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:1)

您可以计算字符串的Godel编号。基本上它会 (int)A [0] * 256 ^ n +(int)a [1] * 256 ^(n-1).... +(int)A [0]

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

接下来,只需减少要映射到的光谱范围的因子:

e.g。假设你想进入范围0 ... 2000

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

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

答案 2 :(得分:1)

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

例如,.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 :(得分:1)

我将尝试在字符串上使用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 :(得分:1)

#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 :(得分:0)

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