2015-05-20 25 views
5

gì tôi cần phải tạo ra một hình ảnh năng động đa màu gradient như dưới đây một:động nhiều màu hình ảnh gradient

enter image description here

tôi cần phải tạo ra nó tự động cho 2/3/4/5/6 màu sắc, bây giờ tôi đang làm việc trên gradient màu 6.

Những gì tôi đã làm cho đến bây giờ là:

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

tôi tạo ra các hình ảnh trên với sự giúp đỡ của this article

Nhưng mã ở đây là sử dụng mã màu tĩnh, khi tôi tryed để thao tác với nó tôi nhận được hình ảnh như dưới đây:

enter image description here

EDITED MÃ

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

Bạn có thể thấy rằng hiệu ứng gradient bị mất, bởi vì tĩnh 255 được thay thế bằng giá trị động được tạo ra số âm và do đó mất đi tác dụng của nó.

Ai cũng có thể giúp tôi tạo hình ảnh có màu động với mã này hoặc có thể giúp cung cấp cho tôi một hướng khác để đạt được loại kết quả đầu ra này với thư viện gd.

CẬP NHẬT

Bây giờ khi tôi đã nhận được câu trả lời cho câu hỏi này, tôi đã là một vấn đề mới liên quan đến câu hỏi này.

phân bổ màu sắc ngẫu nhiên gì tôi muốn đạt được là bây giờ, một chút như thế này dưới đây:

enter image description here

Tôi đang đi với mảng sáu màu như trong trường hợp với các vấn đề trên, cần một số gợi ý để đi.

Trả lời

3

Bạn thấy vấn đề mình đã có, thực sự .. Vì vậy, chúng ta hãy làm việc thêm vào rằng:

Bạn có thể thấy rằng hiệu ứng gradient bị mất, bởi vì tĩnh 255 được thay thế bằng giá trị động được tạo ra tiêu cực số và do đó mất hiệu lực của nó.

Vì vậy, thay vì giảm với $i mỗi lần, bạn phải giảm theo tỷ lệ phần trăm là $i.

giả

Chúng tôi muốn đi từ giá trị red: từ 50 đến giá trị red: 200 trong 75 bước. Chúng ta sẽ làm như thế nào?

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

Mã này sẽ cho chúng ta:

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

Bây giờ, chúng ta hãy thích nghi với mã của bạn để phản ánh điều này:

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

Có chắc chắn, những gì biết thêm nào bạn yêu cầu? –

+0

Cảm ơn nỗ lực của bạn, bây giờ tôi đã có một số hướng để di chuyển trên :) –

+0

Giá trị bắt đầu của màu sắc, giá trị kết thúc của màu sắc, số lượng các bước, .. :) - Chỉnh sửa: không có vấn đề, đó là một vấn đề thú vị. – Jordumus

Các vấn đề liên quan