# 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);
}
}```

```<?

\$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

Musisz zmienić ostatni parametr funkcji na False:

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

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

hmm naprawde fajny i przydatny skrypcik :))

<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);`

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

U mnie działa normalnie :P

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

<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

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...

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

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

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

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. :>

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