Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Generator gradientów, Klasa, PHP 4 i 5
FiDO
post
Post #1





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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:

  1. <?php
  2.  
  3. /**
  4.  * @package ColorGradient
  5.  * @author FiDO <fido@list.pl>
  6.  * @version 0.9.1
  7.  */
  8.  
  9. /**
  10.  * Generuje gradient z jednego podanego koloru do drugiego z mozliwosci
  11.  * ustalenia dowolnej ilosci kolorow posrednich
  12.  *
  13.  * Przykład użycia:
  14.  * <code>
  15.  * <?php
  16.  * 
  17.  * $cGrad = new ColorGradient;
  18.  * // z białego do czarnego przez szary
  19.  * $cGrad->addColors(array('#000000', '#C0C0C0', '#FFFFFF'));
  20.  * // ilosc kroków
  21.  * $kolory = $cGrad->get(100);
  22.  * if ($kolory === false)
  23.  * {
  24.  *     echo \"Za mało kolorów lub liczba kroków mniejsza niż liczba kolorów\";
  25.  * }
  26.  * foreach ($kolory as $kolor)
  27.  * {
  28.  *     echo \"<span style='background: $kolor; width: 5px;'>&nbsp;</span>\";
  29.  * }
  30.  *
  31.  * ?>
  32.  * </code>
  33.  *
  34.  * @package ColorGradient
  35.  * @author FiDO <fido@list.pl>
  36.  * @version 0.9.0
  37.  */
  38. class ColorGradient
  39. {
  40.     /**
  41.      * tablica kolorów, z których generujemy gradient
  42.      *
  43.      * @access private
  44.      */
  45.     var $_aColors = array();
  46.  
  47.     /**
  48.      * zmienna decydujaca o tym, czy zwrócone kolory będa w formacie html (np. #FFFFFF)
  49.      * gdy false, każdy kolor zwracany jest jako tablica składajaca się z 3 elem
  50. ntów,
  51.      * których wartosci oznaczaja kolejno red, green, blue
  52.      * 
  53.      * @access public
  54.      */
  55.     var $return_html = true;
  56.  
  57.     /**
  58.      * Sprawdza poprawnosć koloru w formacie tablicowym (r,g,b)
  59.      * 
  60.      * @access private
  61.      * @return boolean true jesli poprawny, w przeciwnym przypadku false
  62.      */
  63.     function _isColorValid($aColor)
  64.     {
  65.         if (!is_array($aColor) || count($aColor) != 3)
  66.         {
  67.             return false;
  68.         }
  69.         for ($i = 0; $i < 3; $i++)
  70.         {
  71.             if (!is_int($aColor[$i]) || $aColor[$i] > 255 || $aColor[$i] < 0)
  72.             {
  73.                 return false;
  74.             }
  75.         }
  76.         return true;
  77.     }
  78.     /**
  79.      * dodaje pojedynczy kolor do tablicy kolorów
  80.      * 
  81.      * dozwolone sa następujace formaty:
  82.      * string : #FFFFFF
  83.      * string : 255,255,255
  84.      * tablica: (255, 255, 255)
  85.      * (wszystkie w kolejnosci RGB)
  86.      *
  87.      * @access public
  88.      * @param mixed dodawany kolor
  89.      * @return boolean true jesli dodanie się powiodło (kolor jest poprawny)
  90.      */
  91.     function addColor($color)
  92.     {
  93.         // zamiana formatów innych niż tablicowy na tablicowy
  94.  
  95.         // string: 255,255,255
  96.         // białe znaki pomiędzy liczbami a przecinkami dozwolone
  97.         if (@preg_match('#^(d+)s*,s*(d+)s*,s*(d+)$#', $color, $rgb))
  98.         {
  99.             $color = array((int)$rgb[1], (int)$rgb[2], (int)$rgb[3]);
  100.         }
  101.         // string: #FFFFFF
  102.         elseif (@preg_match('/^#[0-9a-f]{6}$/i', $color))
  103.         {
  104.             $color  = array_map(
  105.                         \"hexdec\", 
  106.                         explode(\"n\", wordwrap(substr($color, 1), 2, \"n\", true))
  107.                     );
  108.         }
  109.         // string: black, white, red, etc.
  110.         elseif (is_string($color)) 
  111.         {
  112.             @include 'ColorNames.inc.php';
  113.             if (isset($colorNames[$color]))
  114.             {
  115.                  $color = $colorNames[$color];
  116.             }
  117.         }
  118.  
  119.         // jesli kolor poprawny, dodajemy na koniec tablicy
  120.         if ($this->_isColorValid($color))
  121.         {
  122.             $this->_aColors[] = $color;
  123.             return true;
  124.         }
  125.         return false;
  126.     }
  127.  
  128.     /**
  129.      * dodaje kilka kolorów przekazanych za pomoca tablicy
  130.      * 
  131.      * @access public
  132.      * @param array tablica zawierajaca pojedyncze kolory w dozwolonym formacie
  133.      * @return integer liczba poprawnie dodanych kolorów
  134.      */
  135.     function addColors($colors)
  136.     {
  137.         if (!is_array($colors))
  138.         {
  139.             return 0;
  140.         }
  141.         $added = 0;
  142.         foreach ($colors as $color)
  143.         {
  144.             if ($this->addColor($color))
  145.             {
  146.                 $added++;
  147.             }
  148.         }
  149.         return $added;
  150.     }
  151.  
  152.     /**
  153.      * konwertuje kolor w postaci tablicy na format zgodny z html
  154.      * 
  155.      * array(255,0,255) -> #FF00FF
  156.      *
  157.      * @param array kolor do konwersji
  158.      * @return string kod html koloru
  159.      */
  160.     function _toHex($color)
  161.     {
  162.         if (!$this->return_html)
  163.         {
  164.             return $color;
  165.         }
  166.         // konwersja elementów tablicy na liczbe szesnastkowa 
  167.         $color = array_map('strtoupper', array_map('dechex', $color));
  168.         // dopełnienie zerem liczb jednocyfrowych
  169.         array_walk($color, create_function('&$v', '$v = str_pad($v, 2, \"0\", 0);'));
  170.  
  171.         return '#'. implode('', $color);
  172.     }
  173.  
  174.     /**
  175.      * pobiera tablice kolorów posrednich między dwoma danymi (wyłaczajac dane kolory)
  176.      * 
  177.      * @param integer indeks pierwszego koloru
  178.      * @param integer indeks drugiego koloru
  179.      * @param integer ilosć kolorów posrednich do wygenerowania
  180.      * @access private
  181.      * @return array tablica kolorów posrednich
  182.      */
  183.     function _getGradient($c1idx, $c2idx, $steps)
  184.     {
  185.         // no steps.. no intermediate colors..
  186.         if ($steps == 0)
  187.         {
  188.             return array();
  189.         }
  190.  
  191.         // obliczamy krok dla każdej składowej
  192.         for ($i = 0; $i < 3; $i++) 
  193.         {
  194.             $aStep[$i] = ($this->_aColors[$c2idx][$i] - $this->_aColors[$c1idx][$i]) / ($steps + 1);
  195.         }
  196.  
  197.         $inter = array();
  198.         // generacja kolorów posrednich
  199.         for ($i = 1; $i <= $steps; $i++) 
  200.         {
  201.             for ($j = 0; $j < 3; $j++) 
  202.             {
  203.                 $color[$j] = round($this->_aColors[$c1idx][$j] + $aStep[$j] * $i);
  204.                 // make sure we don't go off beyond limits
  205.                 $color[$j] = ($color[$j] > 255) ? 255: $color[$j];
  206.                 $color[$j] = ($color[$j] < 0  ) ? 0  : $color[$j];
  207.             }
  208.             $inter[] = $color;
  209.         }
  210.  
  211.         return array_map(array(&$this, \"_toHex\"), $inter);
  212.     }
  213.  
  214.     /**
  215.      * zwraca tablice kolorów posrednich pomiędzy dodanymi kolorami
  216.      * 
  217.      * @param integer ilosć kolorów, które ma zawierać gradient
  218.      * @return mixed tablica kolorów lub false gdy niemożliwa generacja
  219.      */
  220.     function get($steps)
  221.     {
  222.         // sprawdzenie czy sa dodane conajmniej 2 kolory oraz czy
  223.         // liczba kroków wynosi conajmniej tyle co liczba kolorów
  224.         if ($steps < count($this->_aColors) || count($this->_aColors) < 2)
  225.         {
  226.             return false;
  227.         }
  228.  
  229.         $nColors = count($this->_aColors);
  230.         // liczbę kolorów posrednich do uzyskania pomniejszamy o liczbę kolorów
  231.         $steps -= $nColors;    
  232.         // obliczenie ile potrzeba kroków do przejscia między każda para kolorów
  233.         // najpierw wszystkim dzielimy po równo
  234.         $step    = array_fill(0, $nColors - 1, (int)($steps / ($nColors - 1) ));
  235.         // jesli zostanie reszta to dodajemy po 1 zaczynajac od poczatku
  236.         for ($i = 0; $i < ($steps % ($nColors - 1)); $i++) 
  237.         {
  238.             $step[$i]++;
  239.         }
  240.  
  241.         $out = array($this->_toHex($this->_aColors[0]));
  242.         for ($i = 0, $n = $nColors - 1; $i < $n; $i++) 
  243.         {
  244.             $inter  = $this->_getGradient($i, $i + 1, $step[$i]);
  245.             $out    = array_merge(
  246.                         $out, 
  247.                         $inter, 
  248.                         array($this->_toHex($this->_aColors[$i + 1]))
  249.                     );
  250.         }
  251.         return $out;
  252.     }
  253. } // end class
  254.  
  255. ?>


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)
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 13:15