1

これが私が使用している現在のコードです。

<? 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 の画像関数を扱うことはあまりありません。誰かが私を助けてこれを理解することができれば、本当に感謝しています!

4

3 に答える 3

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);
    }    
}
于 2009-07-24T05:21:10.137 に答える
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);
}?>

変数 $type は 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>
于 2009-07-24T14:48:57.647 に答える
0

幅と高さのループ/値を交換できるはずです。

于 2009-07-23T20:49:52.457 に答える