Na podstawie pewnego kodu w Delphi, napisałem funkcję w PHP, mającą rysować gradient. Niestety, nie działa ona dla każdej kombinacji kolorów 8-|. Dla pary kolorów (czerwony, niebieski) funkcja działa prawidłowo, lecz jeżeli podstawię np. (żółty, zielony) funkcja zwraca jakiś szalony obrazek. Co może być przyczyną?
Z góry dzięki za odpowiedź. :)
function drawGradient($image, $fromColor, $toColor, $steps, $rect, $direction) {
if ($direction)
$rect['right']--;
else
$rect['bottom']--;
if ($steps == 0) $steps = 1;
$startr = ($fromColor & 0x0000FF);
$startg = ($fromColor & 0x00FF00) << 8;
$startb = ($fromColor & 0xFF0000) >> 16;
$endr = ($toColor & 0x0000FF);
$endg = ($toColor & 0x00FF00) >> 8;
$endb = ($toColor & 0xFF0000) >> 16;
$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);
}
}
header("Content-type: image/png");
$im = imageCreateTrueColor(100, 20);
$rect['left'] = 0;
$rect['top'] = 0;
$rect['left'] = 99;
$rect['bottom'] = 19;
$fromColor = imageColorAllocate($im, 255, 0, 0); // funkcja działa dobrze
$toColor = imageColorAllocate($im, 0, 0, 255);
// $fromColor = imageColorAllocate($im, 255, 255, 0); przy tych argumentach funkcja przestaje prawidłowo działać
// $toColor = imageColorAllocate($im, 0, 255, 0);
drawGradient($im, $fromColor, $toColor, 100, $rect, True);
ImagePng($im);