2015-05-20 8 views
5

Was muss ich wie die Multi-Farbverlauf Bild unten ist ein dynamisches schaffen: für 2/3/4/5Dynamische Multi-Farbverlauf Bild

enter image description here

Ich brauche zu erstellen dynamisch/6 Farben, für den Moment arbeite ich an 6 Farbverlauf.

Was ich bisher getan haben, ist:

$size = 1536; 
$thickness = 54; 
$im = imagecreatetruecolor($size, $thickness); 

$clrCount = count($clr);    
$limit = floor($size/$clrCount); 

     for($i = 0; $i < $limit; $i++) { 

      // Line 1: red = 255 ; green = 0 -> 255 ; blue = 0 
      $mycolors[$i] = imagecolorallocate($im, 255, $i, 0); 
      // Line 2: red = 255 -> 0 ; green = 255 ; blue = 0 
      $mycolors[$i + $limit] = imagecolorallocate($im, (255 - $i), 255, 0); 
      // Line 3: red = 0 ; green = 255 ; blue = 0 -> 255 
      $mycolors[$i + $limit*2] = imagecolorallocate($im, 0, 255, $i); 
      // Line 4: red = 0 ; green = 255 -> 0 ; blue = 255 
      $mycolors[$i + $limit*3] = imagecolorallocate($im, 0, (255 - $i), 255); 
      // Line 5: red = 0 -> 255 ; green = 0 ; blue = 255 
      $mycolors[$i + $limit*4] = imagecolorallocate($im, $i, 0, 255); 
      // Line 6: red = 255 ; green = 0 ; blue = 255 -> 0 
      $mycolors[$i + $limit*5] = imagecolorallocate($im, 255, 0, (255 - $i)); 


     } 

     for ($i=0; $i < $size; $i++) { 
      imageline($im, $i, 0, $i, $thickness-1, $mycolors[$i]); 
     } 

imagepng($im); 
imagegd($im); 
imagedestroy($im); 

Ich habe das Bild oben mit Hilfe von this article

Aber der Code ist hier statische Farbcodes verwenden, wenn ich mit zu manipulieren tryed es ich erhalte Bild wie unten:

enter image description here

EDITED CODE

$size = 1536; 
$thickness = 54; 
$im = imagecreatetruecolor($size, $thickness); 

$clrCount = count($clr);    
$limit = floor($size/$clrCount); 

$clr = array(0 => '4d6eae', 1 => 'e58f0e', 2 => 'ff00ff', 3 => '9900ff', 4 => '9f560a', 5 => '93c47d'); 

     list($r, $g, $b) = sscanf($clr[0], "%02x%02x%02x"); 
     list($r1, $g1, $b1) = sscanf($clr[1], "%02x%02x%02x"); 
     list($r2, $g2, $b2) = sscanf($clr[2], "%02x%02x%02x"); 
     list($r3, $g3, $b3) = sscanf($clr[3], "%02x%02x%02x"); 
     list($r4, $g4, $b4) = sscanf($clr[4], "%02x%02x%02x"); 
     list($r5, $g5, $b5) = sscanf($clr[5], "%02x%02x%02x"); 

     for($i = 0; $i < $limit; $i++) { 

      // Line 1: red = 255 ; green = 0 -> 255 ; blue = 0 
      $mycolors[$i] = imagecolorallocate($im, $r, $i, 0); 
      // Line 2: red = 255 -> 0 ; green = 255 ; blue = 0 
      $mycolors[$i + $limit] = imagecolorallocate($im, ($r1 - $i), $g1, 0); 
      // Line 3: red = 0 ; green = 255 ; blue = 0 -> 255 
      $mycolors[$i + $limit*2] = imagecolorallocate($im, 0, $g2, $i); 
      // Line 4: red = 0 ; green = 255 -> 0 ; blue = 255 
      $mycolors[$i + $limit*3] = imagecolorallocate($im, 0, ($g3 - $i), 255); 
      // Line 5: red = 0 -> 255 ; green = 0 ; blue = 255 
      $mycolors[$i + $limit*4] = imagecolorallocate($im, $i, 0, $b4); 
      // Line 6: red = 255 ; green = 0 ; blue = 255 -> 0 
      $mycolors[$i + $limit*5] = imagecolorallocate($im, $r5, 0, ($b5 - $i)); 


     } 

     for ($i=0; $i < $size; $i++) { 
      imageline($im, $i, 0, $i, $thickness-1, $mycolors[$i]); 
     } 

imagepng($im); 
imagegd($im); 
imagedestroy($im); 

können Sie sehen, dass der Gradient-Effekt verloren geht, da die statischen 255 mit dynamischem Wert ersetzt wird, die negativen Zahlen schaffen und somit ihre Wirkung verlieren.

Kann mir jemand helfen, ein dynamisches Farbverlaufsbild mit diesem Code zu erstellen oder kann mir helfen, eine andere Richtung, um diese Art von Ausgabe mit Gd-Bibliothek zu erreichen.

Jetzt AKTUALISIERT

wenn ich die Antwort auf diese Frage bekam, habe ich ein neues Problem auf diese Frage bezogen.

Was ich will, erreichen, ist eine zufällige Farbzuordnung nun, so etwas wie dies unter:

enter image description here

Ich bin wie mit dem Problem, das oben im Fall der sechs Farb Array gehen, müssen einen Hinweis in Gang zu bringen.

Antwort

3

Sie gefunden, das Problem selbst schon, eigentlich .. Also lassen Sie sie arbeitet weiter daran:

Sie können sehen, dass der Gradient-Effekt verloren geht, da die statischen 255 mit dynamischem Wert ersetzt wird, die negativ ist die Schaffung Zahlen und damit seine Wirkung zu verlieren.

Anstatt also mit $i jedes Mal abnimmt, haben Sie mit einem Anteil von $i zu verringern.

Pseudo-Code

Wir von Rot-Wert gehen wollen: 50 bis Rot-Wert: 200 in 75 Stufen. Wie würden wir das machen?

$red = 50; 
for ($i = 0; $i < 75; $i++) { 
    $red = 50 + ((200 - 50)/75) * $i; 
    //Our color is: 
     // The difference between the limits (150: 200-50) 
     // divided by the amount of steps: 75. 
     // We multiply the result by the current step. 
     // And we add the lower limit to it, so we start at 50. 
} 

Dieser Code uns geben wird:

50 - 52 - 54 - 56 - 58 - ... - 192 - 194 - 196 - 198

Nun lassen Sie uns Ihren Code anzupassen, dies zu reflektieren:

for($i = 0; $i < $limit; $i++) { 
    $mycolors[$i] = imagecolorallocate($im, 
     $r + (($r1 - $r)/$limit) * $i, 
     $g + (($g1 - $g)/$limit) * $i, 
     $b + (($b1 - $b)/$limit) * $i); 

    $mycolors[$i + $limit] = imagecolorallocate($im, 
     $r1 + (($r2 - $r1)/$limit) * $i, 
     $g1 + (($g2 - $g1)/$limit) * $i, 
     $b1 + (($b2 - $b1)/$limit) * $i); 

    //Copy-paste magic here 
} 
+0

Ja sicher, was weitere Informationen benötigen Sie? –

+0

Danke für Ihre Mühe, jetzt habe ich eine Richtung, um weiterzugehen :) –

+0

Startwert der Farbe, Endwert der Farbe, Anzahl der Schritte, .. :) - Edit: kein Problem, es ist ein interessantes Problem. – Jordumus