Projektowanie stron WWW od podszewki
Losowy artykuł: 1 listopada

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' 6); $h $tmp['how']; ++$h)
  {
   $tmp['output'] .= dechex(rand(015));
  }

  // 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'] == ? (+ ($h 2)) : ($h)), ($tmp['lenght'] == 1));
 $tmp['output'][$h] = ($tmp['lenght'] == $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 >> 0xff) + ($rgb 0xff)) / <= 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)