[PHP] Problem z gradient'em

0

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

Zamiast:

    $startr = ($fromColor & 0x0000FF);
    $startg = ($fromColor & 0x00FF00) << 8;
    $startb = ($fromColor & 0xFF0000) >> 16;
    $endr   = ($toColor   & 0x0000FF);
    $endg   = ($toColor   & 0x00FF00) >> 8;
    $endb   = ($toColor   & 0xFF0000) >> 16;

Zrob

$startr = ($fromColor >> 16) & 0xFF;
$startg = ($fromColor >> 8) & 0xFF;
$startb = $fromColor & 0xFF;

$endr = ($toColor >> 16) & 0xFF;
$endg = ($toColor >> 8) & 0xFF;
$endb = $toColor & 0xFF;

Zaczerpnięte z: http://pl2.php.net/manual/pl/function.imagecolorat.php

0
Gorion napisał(a)

Zaczerpnięte z: http://pl2.php.net/manual/pl/function.imagecolorat.php

Hehe, czytałem to i nawet skorzystałem z tego w tym miejscu:

      $rgb = $endr + ($endg << 8) + ($endb << 16);
      $r = ($rgb >> 16) & 0xFF;
      $g = ($rgb >> 8) & 0xFF;
      $b = $rgb & 0xFF;

Jednak we wcześniejszym miejscu nie skojarzyłem że trzeba to zastosować. W każdym razie - ogromne dzięki za pomoc. [browar] Kodzik wstawię do FAQ'u, bo chyba jeszcze nie ma :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1