2009-07-23 5 views
1

다음은 현재 사용중인 코드입니다.PHP를 사용하여 왼쪽에서 오른쪽으로 그라디언트를 만들 수있는 스크립트가 있습니까?

<? header("Content-type: image/png"); 
// example: <img src="gradient.php?height=600&width=100&start=00FF00&end=ff0000" /> 
$height=100; 
$width=1; 
$start='000000'; 
$end='FFFFFF'; 
extract($_REQUEST); // overwrite using vars from url 
$start_r = hexdec(substr($start,0,2)); 
$start_g = hexdec(substr($start,2,2)); 
$start_b = hexdec(substr($start,4,2)); 
$end_r = hexdec(substr($end,0,2)); 
$end_g = hexdec(substr($end,2,2)); 
$end_b = hexdec(substr($end,4,2)); 
$image = @imagecreate($width,$height); 
for($y=0;$y<$height;$y++){ 
    for($x=0;$x<$width;$x++){ 
     if($start_r==$end_r) $new_r = $start_r; 

     $difference = $start_r-$end_r; 
     $new_r = $start_r-intval(($difference/$height)*$y); 

     if($start_g==$end_g) $new_g = $start_g; 

     $difference = $start_g-$end_g; 
     $new_g = $start_g-intval(($difference/$height)*$y);  

     if($start_b==$end_b) $new_b = $start_b; 

     $difference = $start_b - $end_b; 
     $new_b = $start_b-intval(($difference/$height)*$y); 

     $row_color = imagecolorresolve($image,$new_r,$new_g,$new_b); 
     imagesetpixel($image,$x,$y,$row_color); 
    }  
} 
imagepng($image); 
imagedestroy($image); 
?> 

위의 코드는 수직 (상단에서 하단) 그래디언트를 만드는 데 완벽하게 작동하지만 가로형도 만들 수 있기를 바랍니다. 필자는 PHP에 대해 잘 알고 있지만 PHP 이미지 함수는 자주 다루지 않습니다. 누군가가 나를 도울 수 있고 이것을 알아낼 수 있다면 정말 고맙겠습니다!

+0

당신은 아마 모든 이동할 수 첫 번째 루프에 imagesetpixel()을 제외한 코드 줄 - 다른 줄은 $ x와 함께 변경되지 않으므로 각 픽셀의 색을 계산하는 것보다 훨씬 빠릅니다. –

+0

죄송합니다. 코드 줄마다 $ x for loop –

+2

이 스크립트를 수정할 수 없다면 "PHP에 대해 잘 알고있다"고 말할 수는 없습니다. 이미지 기능에 익숙하지 않은 것은 중요하지 않습니다 ... 스크립트의 기능은 매우 분명합니다. 스크립트에없는 기능은 사용하지 않아도됩니다. 나는 네가 게으르다 고 생각한다. – mpen

답변

3

이 코드는 세로 그라디언트에 사용할 수 있으며 속도도 빨라집니다.

내가 쓸모없는 코드를 주석 처리 했으므로 삭제할 항목을 알고 있습니다.

for($x=0;$x<$width;$x++){ 
    /*if($start_r==$end_r) $new_r = $start_r;*/ 
    // ^^ the line above is useless, $new_r will be set below either way 

    $difference = $start_r-$end_r; 
    $new_r = $start_r-intval(($difference/$width)*$x); 

    /*if($start_g==$end_g) $new_g = $start_g;*/ 
    // ^^ the line above is useless, $new_g will be set below either way 

    $difference = $start_g-$end_g; 
    $new_g = $start_g-intval(($difference/$width)*$x);  

    /*if($start_b==$end_b) $new_b = $start_b;*/ 
    // ^^ the line above is useless, $new_b will be set below either way 

    $difference = $start_b - $end_b; 
    $new_b = $start_b-intval(($difference/$width)*$x); 

    $new_color = imagecolorresolve($image,$new_r,$new_g,$new_b); 
    // ^^ used to be $row_color 

    for($y=0;$y<$height;$y++){ 
     imagesetpixel($image,$x,$y,$new_color); 
    }  
} 
0

너비와 높이 루프/값을 바꿀 수 있어야합니다.

1

감사합니다. Gert!

다음은 마지막 코드입니다. 효율적인 이미지 캐시이며 파일 크기가 매우 친숙합니다.

<? header("Content-type: image/png"); // example: <img src="gradient.php?width=100&start=00FF00&end=ff0000&type=x" /> 
$width = 1; $height=1; $start='000000'; $end='FFFFFF'; $type='x'; extract($_REQUEST); 
$path = "gradients/".$start."-".$end."_".$width."x".$height."_".$type.".png"; 
if(file_exists($path)) echo file_get_contents($path); 
else{ 
    $r1 = hexdec(substr($start,0,2)); $g1 = hexdec(substr($start,2,2)); $b1 = hexdec(substr($start,4,2)); 
    $r2 = hexdec(substr($end,0,2)); $g2 = hexdec(substr($end,2,2)); $b2 = hexdec(substr($end,4,2)); 
    $image = @imagecreate($width,$height); 
    switch($type){ 
     case 'x': $d1 = 'height'; $d2 = 'width'; $v1 = 'y'; $v2 = 'x'; break; 
     case 'y': $d1 = 'width'; $d2 = 'height'; $v1 = 'x'; $v2 = 'y'; break; 
    } 
    for($$v1=0;$$v1<$$d1;$$v1++){ 
     $r = $r1-intval((($r1-$r2)/$$d1)*$$v1); $g = $g1-intval((($g1-$g2)/$$d1)*$$v1); $b = $b1-intval((($b1-$b2)/$$d1)*$$v1); 
     $color = imagecolorresolve($image,$r,$g,$b); for($$v2=0;$$v2<$$d2;$$v2++) imagesetpixel($image,$x,$y,$color); 
    } imagepng($image,$path,1); imagepng($image,NULL,1); imagedestroy($image); 
}?> 

변수 $의 타입이 X 또는 Y 될 수 있으며, 그것은 당신의 CSS 시트 관련하고 반복 좌표 어떤 것 ... 다음은 몇 가지 예입니다

<style type="text/css"> 
body{ 
     background:url(gradient.php?height=123&start=ABBABB&end=FFF000&type=x) repeat-x scroll top left; /* the &type=x' so the repeat is 'repeat-x'. height needs set. */ 
} 
</style> 

<style type="text/css"> 
body{ 
     background:url(gradient.php?width=345&start=111222&end=999888&type=y) repeat-y scroll top left; /* the &type=y' so the repeat is 'repeat-y'. width needs set. */ 
} 
</style> 
+0

여러분을 환영합니다! 승인 된 답변 주셔서 감사합니다! – Gert