Projektowanie stron WWW od podszewki

Artykuły na każdy temat

[PHP] Losowy kolor w trzech postaciach

Dodano 28.12.2009r. o 05:29
W wyniku potrzeb napisałem prostą funkcję do generowania losowego koloru. Wywołać ją możemy z jednym z trzech możliwych parametrów (primary, short lub long).
Kod:
<?php
$cfg['primary_color'] = array('black', 'silver', 'gray', 'white', 'maroon', 'red', 'purple', 'fuchsia', 'green', 'lime', 'olive', 'yellow', 'navy', 'blue', 'teal', 'aqua');

function random_color($type)
{
 /*
  * @Name_function: random_color
  * @Description: function returns a random color, depending on $type
  * @Argument: $type (string)
  *            primary -> 16 combination
  *            short -> 4 096 combination
  *            long -> 16 777 216 combination
  * @Return: (string)
  */

 global $cfg;

 // Jeżeli wersja PHP < 4.2.0 wtedy zachodzi potrzeba użycia generator liczb losowych
 // srand(floor(time() / (60*60*24)));

 if($type == 'primary')
 {
  $tmp['output'] = $cfg['primary_color'][array_rand($cfg['primary_color'])];
 }
 else if($type == 'short' || $type == 'long')
 {
  $tmp['output'] = '#';

  for($h = 0, $tmp['how'] = ($type == 'short' ? 3 : 6); $h < $tmp['how']; ++$h)
  {
   $tmp['output'] .= dechex(rand(0, 15));
  }

  // Zbędna kosmetyka dla fanatyków
  $tmp['output'] = strtoupper($tmp['output']);
 }

 return $tmp['output'];
}

echo random_color('primary');
echo '<br />';
echo random_color('short');
echo '<br />';
echo random_color('long');
?>
Poniżej znajduję się funkcja zmieniająca kod koloru zapisany szesnastkowo do numeru koloru zapisanego w RGB
Kod:
<?php
function hex_to_rgb($r, $g, $b)
{
 /*
  * @Name_function: hex_to_rgb
  * @Description: function changes the hex color to rgb number color
  * @Argument: $hex (string)
  * @Return: (int)
  * @Other: General formula -> R * 256^2 + G * 256 + B
  *         256^2 = pow(256, 2) = 65536
  */

 // @Info: to jest stara wersja gdzie przyjmowano, że kolor jest zawsze w postaci długiej oraz funkcja przyjmuję tylko jeden parametr ($hex)
 // return hexdec(substr($hex, 1, 2)) * pow(256, 2) + hexdec(substr($hex, 3, 2)) * 256 + hexdec(substr($hex, 5, 2));

 return $r * 65536 + $g * 256 + $b;
}

$tmp['color'] = '#FFF';
$tmp['lenght'] = strlen($tmp['color']);

for($h = 0; $h < 3; ++$h)
{
 $tmp['output'][$h] = substr($tmp['color'], ($tmp['lenght'] == 7 ? (1 + ($h * 2)) : (1 + $h)), ($tmp['lenght'] == 7 ? 2 : 1));
 $tmp['output'][$h] = ($tmp['lenght'] == 7 ? $tmp['output'][$h] : str_repeat($tmp['output'][$h], 2));
}

$tmp['r'] = $tmp['output'][0];
$tmp['g'] = $tmp['output'][1];
$tmp['b'] = $tmp['output'][2];
// Porządki
unset($tmp['output'], $tmp['lenght']);

echo $tmp['color'].' = (rgb)'.hex_to_rgb(hexdec($tmp['r']), hexdec($tmp['g']), hexdec($tmp['b']));
?>
Poniżej znajduję się jedna z możliwych metod zmiany krótkiego zapisu koloru w systemie szesnastkowych na postać długą.
Kod:
<?php
function short_hex_to_long_hex($hex)
{
 /*
  * @Name_function: short_hex_to_long_hex
  * @Description: function returns converted long hex color from short hex
  * @Argument: $hex (string)
  * @Return: (string)
  */

 if(strlen($hex) == 4)
 {
  $tmp['output'] = str_split($hex);
  $tmp['output'][5] = $tmp['output'][6] = $tmp['output'][3];
  $tmp['output'][3] = $tmp['output'][4] = $tmp['output'][2];
  $tmp['output'][2] = $tmp['output'][1];
  sort($tmp['output']);
  $tmp['output'] = implode('', $tmp['output']);
 }

 return $tmp['output'];
}
?>
Poniżej znajduję się funkcja, która powie nam czy kolor napisu na wylosowanym kolorze ma być biały czy czarny.
Kod:
<?php
function whether_font_color_is_white_or_black($rgb)
{
 /*
  * @Name_function: whether_font_color_is_white_or_black
  * @Description: function says that the font color is white or black
  * @Argument: $rgb (int)
  * @Return: (string)
  */

 return ((($rgb >> 16) + ($rgb >> 8 & 0xff) + ($rgb & 0xff)) / 3 <= 0x7f ? '#FFF' : '#000');
}
?>
Przy tworzeniu dema musiałem nieco zmodyfikowac tablice $cfg['primary_color'] i losowanie z niej. Wyglada ona nastepujaca:
Kod:
<?php
$cfg['primary_color'] = array('black' => '000', 'silver' => 'C0C0C0', 'gray' => '808080', 'white' => 'FFF', 'maroon' => '800000', 'red' => 'F00', 'purple' => '800080', 'fuchsia' => 'F0F', 'green' => '008000', 'lime' => '0F0', 'olive' => '808000', 'yellow' => 'FF0', 'navy' => '000080', 'blue' => '00F', 'teal' => '008080', 'aqua' => '0FF');
?>
W funkcji random_color() uległ zmiane ten kawalek kodu:
Kod:
<?php
function random_color($type)
{
 // ciach

 if($type == 'primary')
 {
  $tmp['output'] = array_rand($cfg['primary_color']);
 }

 // ciach
}
?>

Demo

Demo wykorzystania powyższych rozwiązań znajduje się pod adresem Losowy kolor w PHP.

Więcej informacji na:
http://php.net/manual/pl/function.array-rand.php
http://php.net/manual/pl/function.implode.php
http://php.net/manual/pl/function.dechex.php
http://php.net/manual/pl/function.hexdec.php
http://php.net/manual/pl/function.sort.php
http://php.net/manual/pl/function.str-repeat.php
http://php.net/manual/pl/function.str-split.php
http://php.net/manual/pl/function.strlen.php
http://php.net/manual/pl/function.strtoupper.php
http://php.net/manual/pl/function.substr.php

Komentarze

Publikowane komentarze są prywatnymi opiniami użytkowników serwisu. Serwis nie ponosi odpowiedzialności za treść opinii. W trosce o zachowanie poziomu dyskusji wszystkie komentarze podlegają akceptacji przed ich publikacją dlatego proszę cierpliwie czekać aż komentarz zostanie opublikowany.

CapaciousCore

Dodano 03.05.2012r. o 21:23
Jeżeli miałbym coś sugerować to proponuje także wykorzystać i/lub rozbudować taką oto klasę, którą jakiś czas temu budowałem.

Mikolaj

Dodano 03.05.2012r. o 21:10
Super skrypt
Tylko w funkcji whether_font_color_is_white_or_black
wpisałem 0x73 zamiast
0x7f

Dodaj komentarz

Zostaw komentarz jeżeli możesz! Nie bądź przysłowiowym botem! Nie bądź obojętny! Ciebie to nic nie kosztuje, a mi sprawi uśmiech na twarzy.
Zezwolono używać: BBCode
Zabroniono używać:
znaczników HTML

(Wymagany)

(Wymagany, niepublikowany)

(Nie wymagana)

Token:

Obrazek dla bota

(Przepisz tylko cyfry!)

(Wymagana)