Programowanie w języku PHP » FAQ

Jak wyświetlić gradient

  function drawGradient($image, $fromColor, $toColor, $steps, $rect, $direction) {
    if ($direction)
      $rect['right']--;
    else   
      $rect['bottom']--;
 
    if ($steps == 0) $steps = 1;
 
    $startr = $fromColor & 0xFF;
    $startg = ($fromColor >> 8) & 0xFF;
    $startb = ($fromColor >> 16) & 0xFF;
 
    $endr = $toColor & 0xFF;
    $endg = ($toColor >> 8) & 0xFF;
    $endb = ($toColor >> 16) & 0xFF;
 
    $diffr  = $endr - $startr;
    $diffg  = $endg - $startg;
    $diffb  = $endb - $startb;
 
    $rstepr = $diffr / $steps;
    $rstepg = $diffg / $steps;
    $rstepb = $diffb / $steps;    
 
    if ($direction)
      $rstepw = ($rect['right'] - $rect['left']) / $steps;
    else
      $rstepw = ($rect['bottom'] - $rect['top']) / $steps;    
 
    for ($i = 0; $i < $steps; $i++) {
      $endr = $startr + round($rstepr * $i);
      $endg = $startg + round($rstepg * $i);
      $endb = $startb + round($rstepb * $i);
      $stepw = round($i * $rstepw);            
      $rgb = $endr + ($endg << 8) + ($endb << 16);
      $r = ($rgb >> 16) & 0xFF;
      $g = ($rgb >> 8) & 0xFF;
      $b = $rgb & 0xFF;      
 
      $color = imageColorAllocate($image, $r, $g, $b);
      if ($direction)
        imageRectangle($image, $rect['left'] + $stepw, $rect['top'],
          $rect['left'] + $stepw + round($rstepw) + 1, $rect['bottom'], $color);
      else
        imageRectangle($image, $rect['left'], $rect['top'] + $stepw,
          $rect['right'], $rect['top'] + $stepw + round($rstepw) + 1, $color);
    }    
  }


Przykład zastosowania:
<?
  header("Content-type: image/png");
 
  $im = imageCreateTrueColor(100, 20);  
 
  $rect['left'] = 0;
  $rect['top'] = 0;
  $rect['right'] = 99;
  $rect['bottom'] = 19;
 
  $fromColor = imageColorAllocate($im, 255, 255, 0);
  $toColor = imageColorAllocate($im, 0, 255, 0);  
  drawGradient($im, $fromColor, $toColor, imagesx($im), $rect, True);
 
  ImagePng($im);
?>

Powyższy kod zapisujemy np. pod nazwą gradient.php. Na stronie umieszczamy za pomocą kodu:
<img src="gradient.php">

14 komentarzy

Patyk 2007-09-02 19:44

Musisz zmienić ostatni parametr funkcji na False:

drawGradient($im, $fromColor, $toColor, imagesx($im), $rect, False);

Dymus 2007-07-31 13:18

Jak edytować ten skrypt by gradient tworzony był poziomo?

Zawadzki 2006-02-03 22:26

hmm naprawde fajny i przydatny skrypcik :))

Patyk 2005-10-05 14:13

<quote>Chyba coś nie teges...</quote>Teges, teges :D

drawGradient($im, $fromColor, $toColor, /* --> */ 100 /* <-- */, $rect, True);

Tutaj trzeba podać ilość kroków, musisz po prostu podmienić tą wartość na 400.

Dla ułatwienia usprawniłem kod zamieniając sztywne podawanie rozmiaru na funkcję:
imagesx($im);

Marooned 2005-10-05 02:13

Chyba coś nie teges...
dałem:

  $im = imageCreateTrueColor(400, 100);  
 
  $rect[\'left\'] = 0;
  $rect[\'top\'] = 0;
  $rect[\'right\'] = 399;
  $rect[\'bottom\'] = 99;


i mam mnóstwo czarnych pasów

Patyk 2005-10-04 19:23

U mnie działa normalnie :P

angel2953 2005-10-04 17:58

no bo przy wymiarach 100x10 mam bardzo nieciekawy efekt "paskowy", tak samo jak przy ustawieniach 10x100

{Dopisane]
Patyk chodziło mi właśnie o to co mówił Marooned

Patyk 2005-10-04 14:54

<quote>czy tutaj ma być dwa razy $rect['left'] ?</quote>
Heh :/ już poprawione. Mam nadzieję że teraz wszystko jest OK. :)

<quote>I jeszcze jedno: daj wymiary obrazka: 100x10...</quote> Co za różnica czy 100x10 czy 100x20 ? :P

angel2953 2005-10-04 10:22

jedno pytanie:

  $rect['left'] = 0;
  $rect['top'] = 0;
  $rect['left'] = 99;
  $rect['bottom'] = 1

czy tutaj ma być dwa razy $rect['left'] ?

I jeszcze jedno: daj wymiary obrazka: 100x10...

Adamo 2005-10-04 00:35

jest, tylko pokaż źródło jest nieaktywne ale można bardzo łatwo view-source:http://localhost/gradient.php :P

migajek 2005-10-03 21:42

Wolverine: no chyba ze ktos uzywa IE tam chyba nie ma takiej mozliwosci...:P

Wolverine 2005-10-03 21:07

angel2953: kliknij zeby zrodlo pokazal, tam wszystkiego sie dowiesz :)

Patyk 2005-10-03 20:52

Sprawdź to lepiej, może masz coś źle z biblioteką GD. Przed wrzuceniem tutaj testowałem na 3 serwerach (swoim - lokalnym i 2 zewnętrznych)... Problemu nie było...

BTW: Mam nadzieję, że wrzucasz funkcję do pliku gradient.php lub stosujesz jakies include'y. :>

angel2953 2005-10-03 20:10

nie działa...
Obrazek \"http://localhost/gradient.php\" nie może zostać wyświetlony, ponieważ zawiera błędy... Gdieś masz błąd :]