我想从给定的字符串创建颜色。该字符串不必与任何形式的结果颜色相关,但相同的字符串应始终产生相同的颜色。
此问题不受特定编程语言的约束,因此“颜色”应采用与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 );
}
答案 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的流,并将文本值作为无符号字符读取。