Как я могу преобразовать строки в HTML-хэш-код цвета? - PullRequest
16 голосов
/ 16 сентября 2010

Я бы хотел представить строки в произвольных цветах html.

Пример:

"бла-бла" = # FFCC00
"foo foo 2" = # 565656

Неважно, что представляет собой действительный цветовой код, если это действительный шестнадцатеричный цветовой код HTML и весь спектр достаточно хорошо представлен.

Я думаю, что первым шагом было бы сделатьMD5 в строке, а затем каким-то образом преобразовать его в шестнадцатеричный код цвета?

Обновление: Пример использования - создание визуального отчета о запросах файлов на сервере.Цвета не должны выглядеть красиво, тем более, что человеческий мозг может быстрее обнаруживать закономерности и т.д. в данных.

Ответы [ 5 ]

35 голосов
/ 16 сентября 2010

Спасибо за указатели, это, кажется, делает компетентную работу:

function stringToColorCode($str) {
  $code = dechex(crc32($str));
  $code = substr($code, 0, 6);
  return $code;
}

$str = 'test123';
print '<span style="background-color:#'.stringToColorCode($str).'">'.$str.'</span>';
18 голосов
/ 16 сентября 2010

Почти всегда, просто используя случайные цвета

  1. плохо выглядит
  2. конфликт с фоном

Я бы порекомендовал создать (длинный) список цветов, которые хорошо сочетаются с вашим фоном, а затем просто хешируйте строку и модуль (%) с вашим количеством цветов, чтобы получить индекс в таблице.

public function colorFromString($string)
{
  $colors = [
    '#0074D9',
    '#7FDBFF',
    '#39CCCC',
    // this list should be as long as practical to avoid duplicates
  ];

  // generate a partial hash of the string (a full hash is too long for the % operator)
  $hash = substr(sha1($string), 0, 10);

  // determine the color index
  $colorIndex = hexdec($hash) % count($colors);

  return $colors[$colorIndex];
}
17 голосов
/ 16 сентября 2010

Я согласен с sje397 выше, что совершенно случайные цвета могут в конечном итоге выглядеть неприятно. Вместо того, чтобы составлять длинный список красивых цветов, я бы предложил выбрать постоянную насыщенность + значение свечения и варьировать оттенок в зависимости от содержимого. Чтобы получить цвет RGB от цвета HSL, вы можете использовать нечто похожее на то, что описано в http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB.

Вот пример (попробуйте в http://codepad.viper -7.com что-то, что работает, например, https://codepad.remoteinterview.io/ZXBMZWYJFO):

<?php

function hsl2rgb($H, $S, $V) {
    $H *= 6;
    $h = intval($H);
    $H -= $h;
    $V *= 255;
    $m = $V*(1 - $S);
    $x = $V*(1 - $S*(1-$H));
    $y = $V*(1 - $S*$H);
    $a = [[$V, $x, $m], [$y, $V, $m],
          [$m, $V, $x], [$m, $y, $V],
          [$x, $m, $V], [$V, $m, $y]][$h];
    return sprintf("#%02X%02X%02X", $a[0], $a[1], $a[2]);
}

function hue($tstr) {
    return unpack('L', hash('adler32', $tstr, true))[1];
}

$phrase = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.";
$words = [];
foreach (explode(' ', $phrase) as $word)
    $words[hue($word)] = $word;
ksort($words);
foreach ($words as $h => $word) {
    $col = hsl2rgb($h/0xFFFFFFFF, 0.4, 1);
    printf('<span style="color:%s">%s</span> ', $col, $word);
}
?>
6 голосов
/ 25 апреля 2017

Один лайнер:

substr(md5($string), 0, 6);
0 голосов
/ 03 июня 2015

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

https://mrkmg.com/blog/2012/01/13/php-function-to-generate-a-color-from-a-text-string/

Дайте ему строку, минимальную яркость (0-255) и дисперсию (2-10), и она сгенерирует цвет для вашей строки. Этот может дать вам красивые цвета, если настроить.

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