No to ja bede pierwszy jako, ze mnie tu Bakus przekierował (IMG:
http://forum.php.pl/style_emoticons/default/smile.gif)
A więc klasa ta służy do generacji kolorów pośrednich między dwoma podanymi kolorami, pomiędzy którymi mogą być dowolne inne kolory pośrednie (np. przejście z bialego do czarnego przez czerwony). Wszystko jest w zasadzie opisane w komentarzach do kodu, łącznie z przykladem uzycia. Nadmienie tylko w razie, gdyby nie bylo to takie oczywiste, ze jak dodamy np. 4 kolory, to poczatkowym jest ten pierwszy, koncowym ostatni dodany, natomiast wszystkie dodane "w srodku" beda kolorami, przez które gradient będzie stopniowo przechodził.
Ilosc kolorow posrednich, ktore chcemy uzyskac (czyli w pewnym sensie dokladnosc czy tez szczegolowosc gradientu) jest podawana przez parametr do metody
get() Ilosc ta zawiera kolory podane.. czyli jak np. generujemy gradient z dwoch kolorow w 100 krokach, samych kolorow posrednich (tych co zostaly wygenerowane), bedzie wynosila 98.
Oto i kod:
<?php
/**
* @package ColorGradient
* @author FiDO <fido@list.pl>
* @version 0.9.1
*/
/**
* Generuje gradient z jednego podanego koloru do drugiego z mozliwosci
* ustalenia dowolnej ilosci kolorow posrednich
*
* Przykład użycia:
* <code>
* <?php
*
* $cGrad = new ColorGradient;
* // z białego do czarnego przez szary
* $cGrad->addColors(array('#000000', '#C0C0C0', '#FFFFFF'));
* // ilosc kroków
* $kolory = $cGrad->get(100);
* if ($kolory === false)
* {
* echo \"Za mało kolorów lub liczba kroków mniejsza niż liczba kolorów\";
* }
* foreach ($kolory as $kolor)
* {
* echo \"<span style='background: $kolor; width: 5px;'> </span>\";
* }
*
* ?>
* </code>
*
* @package ColorGradient
* @author FiDO <fido@list.pl>
* @version 0.9.0
*/
class ColorGradient
{
/**
* tablica kolorów, z których generujemy gradient
*
* @access private
*/
var $_aColors = array();
/**
* zmienna decydujaca o tym, czy zwrócone kolory będa w formacie html (np. #FFFFFF)
* gdy false, każdy kolor zwracany jest jako tablica składajaca się z 3 elem
ntów,
* których wartosci oznaczaja kolejno red, green, blue
*
* @access public
*/
var $return_html = true;
/**
* Sprawdza poprawnosć koloru w formacie tablicowym (r,g,b)
*
* @access private
* @return boolean true jesli poprawny, w przeciwnym przypadku false
*/
function _isColorValid($aColor)
{
if (!is_array($aColor) || count($aColor) != 3)
{
return false;
}
for ($i = 0; $i < 3; $i++)
{
if (!is_int($aColor[$i]) || $aColor[$i] > 255 || $aColor[$i] < 0)
{
return false;
}
}
return true;
}
/**
* dodaje pojedynczy kolor do tablicy kolorów
*
* dozwolone sa następujace formaty:
* string : #FFFFFF
* string : 255,255,255
* tablica: (255, 255, 255)
* (wszystkie w kolejnosci RGB)
*
* @access public
* @param mixed dodawany kolor
* @return boolean true jesli dodanie się powiodło (kolor jest poprawny)
*/
function addColor($color)
{
// zamiana formatów innych niż tablicowy na tablicowy
// string: 255,255,255
// białe znaki pomiędzy liczbami a przecinkami dozwolone
if (@preg_match('#^(d+)s*,s*(d+)s*,s*(d+)$#', $color, $rgb))
{
$color = array((int)$rgb[1], (int)$rgb[2], (int)$rgb[3]);
}
// string: #FFFFFF
elseif (@preg_match('/^#[0-9a-f]{6}$/i', $color))
{
$color = array_map(
\"hexdec\",
explode(\"n\", wordwrap(substr($color, 1), 2, \"n\", true))
);
}
// string: black, white, red, etc.
elseif (is_string($color))
{
@include 'ColorNames.inc.php';
if (isset($colorNames[$color]))
{
$color = $colorNames[$color];
}
}
// jesli kolor poprawny, dodajemy na koniec tablicy
if ($this->_isColorValid($color))
{
$this->_aColors[] = $color;
return true;
}
return false;
}
/**
* dodaje kilka kolorów przekazanych za pomoca tablicy
*
* @access public
* @param array tablica zawierajaca pojedyncze kolory w dozwolonym formacie
* @return integer liczba poprawnie dodanych kolorów
*/
function addColors($colors)
{
if (!is_array($colors))
{
return 0;
}
$added = 0;
foreach ($colors as $color)
{
if ($this->addColor($color))
{
$added++;
}
}
return $added;
}
/**
* konwertuje kolor w postaci tablicy na format zgodny z html
*
* array(255,0,255) -> #FF00FF
*
* @param array kolor do konwersji
* @return string kod html koloru
*/
function _toHex($color)
{
if (!$this->return_html)
{
return $color;
}
// konwersja elementów tablicy na liczbe szesnastkowa
$color = array_map('strtoupper', array_map('dechex', $color));
// dopełnienie zerem liczb jednocyfrowych
array_walk($color, create_function('&$v', '$v = str_pad($v, 2, \"0\", 0);'));
return '#'. implode('', $color);
}
/**
* pobiera tablice kolorów posrednich między dwoma danymi (wyłaczajac dane kolory)
*
* @param integer indeks pierwszego koloru
* @param integer indeks drugiego koloru
* @param integer ilosć kolorów posrednich do wygenerowania
* @access private
* @return array tablica kolorów posrednich
*/
function _getGradient($c1idx, $c2idx, $steps)
{
// no steps.. no intermediate colors..
if ($steps == 0)
{
return array();
}
// obliczamy krok dla każdej składowej
for ($i = 0; $i < 3; $i++)
{
$aStep[$i] = ($this->_aColors[$c2idx][$i] - $this->_aColors[$c1idx][$i]) / ($steps + 1);
}
$inter = array();
// generacja kolorów posrednich
for ($i = 1; $i <= $steps; $i++)
{
for ($j = 0; $j < 3; $j++)
{
$color[$j] = round($this->_aColors[$c1idx][$j] + $aStep[$j] * $i);
// make sure we don't go off beyond limits
$color[$j] = ($color[$j] > 255) ? 255: $color[$j];
$color[$j] = ($color[$j] < 0 ) ? 0 : $color[$j];
}
$inter[] = $color;
}
return array_map(array(&$this, \"_toHex\"), $inter);
}
/**
* zwraca tablice kolorów posrednich pomiędzy dodanymi kolorami
*
* @param integer ilosć kolorów, które ma zawierać gradient
* @return mixed tablica kolorów lub false gdy niemożliwa generacja
*/
function get($steps)
{
// sprawdzenie czy sa dodane conajmniej 2 kolory oraz czy
// liczba kroków wynosi conajmniej tyle co liczba kolorów
if ($steps < count($this->_aColors) || count($this->_aColors) < 2)
{
return false;
}
$nColors = count($this->_aColors);
// liczbę kolorów posrednich do uzyskania pomniejszamy o liczbę kolorów
$steps -= $nColors;
// obliczenie ile potrzeba kroków do przejscia między każda para kolorów
// najpierw wszystkim dzielimy po równo
$step = array_fill(0, $nColors - 1, (int)($steps / ($nColors - 1) ));
// jesli zostanie reszta to dodajemy po 1 zaczynajac od poczatku
for ($i = 0; $i < ($steps % ($nColors - 1)); $i++)
{
$step[$i]++;
}
$out = array($this->_toHex($this->_aColors[0]));
for ($i = 0, $n = $nColors - 1; $i < $n; $i++)
{
$inter = $this->_getGradient($i, $i + 1, $step[$i]);
$out = array_merge(
$out,
$inter,
array($this->_toHex($this->_aColors[$i + 1]))
);
}
return $out;
}
} // end class
?>
Dodatkowo wersja do sciagniecia:
http://willow.iie.uz.zgora.pl/~ipatalas/de...lorGradient.zip(szerokosc TAB'ow w kodzie: 4)
A teraz mozecie krytykowac (IMG:
http://forum.php.pl/style_emoticons/default/tongue.gif)