Алгоритм: создать цвет из строки - PullRequest
8 голосов
/ 01 мая 2011

Я хочу создать цвет из заданной строки.Строка не обязательно должна быть связана с результирующим цветом в любой форме, но одна и та же строка всегда должна приводить к одному и тому же цвету.

Этот вопрос не связан с конкретным языком программирования, поэтому «Цвет»должен быть в не зависящем от языка формате, таком как 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 ]

10 голосов
/ 01 мая 2011

Возьмите хеш строки, затем используйте первые три байта хеша как значения Red, Blue и Green.

1 голос
/ 01 мая 2011
#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());
}

Пример хеша

1 голос
/ 01 мая 2011

У меня будет попытка с 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]

1 голос
/ 01 мая 2011

Вы можете использовать любой алгоритм хеширования, чтобы создать значение из строки, которая всегда одинакова для любой заданной строки, и получить из нее компоненты цвета.

Метод GetHashCode в .NET, например, возвращает целое число, поэтому было бы легко создать значение 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;
1 голос
/ 01 мая 2011

Вы можете вычислить число Годеля в строке. В основном это было бы (int) A [0] * 256 ^ n + (int) a [1] * 256 ^ (n-1) .... + (int) A [0]

То же самое, что и в нашей системе счисления, но с использованием базы 256, поскольку существует 256 возможных значений символов.

Далее, просто уменьшите на коэффициент для спектра, который вы хотите отобразить:

например. Предположим, вы хотите в диапазоне 0 ... 2000

Затем просто возьмите любое полученное число и разделите на (наибольшее число в вашем диапазоне) / 2000

Преимущество этого подхода в том, что он даст вам более широкий диапазон цветов, чем просто RGB. Однако, если вы хотите простоту 3 основных цветов, вы можете просто разделить на 3 и взять другие диапазоны, или взять мод 3.

0 голосов
/ 01 мая 2011

Есть несколько способов сделать это в зависимости от того, чего вы пытаетесь достичь.Проще всего превратить строку в поток с помощью str_stream и прочитать текстовые значения как символы без знака.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...