代码之家  ›  专栏  ›  技术社区  ›  Volomike nbk

如何在PHP中绘制稍微倾斜的渐变填充?

  •  3
  • Volomike nbk  · 技术社区  · 16 年前

    我发现下面的函数可以在PHP中绘制垂直渐变。然而,许多网页设计师喜欢他们的渐变有一个左上角的光源,使渐变看起来更现实。那么,如何在垂直梯度上稍微改变角度,使其变成一个轻微的梯度呢?我不想做得太过火,只想在垂直梯度下降的过程中稍微向右移动一下。

    <?php
    
    function hex2rgb($sColor) {
        $sColor = str_replace('#','',$sColor);
        $nLen = strlen($sColor) / 3;
        $anRGB = array();
        $anRGB[]=hexdec(str_repeat(substr($sColor,0,$nLen),2/$nLen));
        $anRGB[]=hexdec(str_repeat(substr($sColor,$nLen,$nLen),2/$nLen));
        $anRGB[]=hexdec(str_repeat(substr($sColor,2*$nLen,$nLen),2/$nLen));
        return $anRGB;
    }
    
    $nWidth = 960;
    $nHeight = 250;
    $sStartColor = '#2b8ae1';
    $sEndColor = '#0054a1';
    $nStep = 1;
    
    $hImage = imagecreatetruecolor($nWidth,$nHeight);
    $nRows = imagesy($hImage);
    $nCols = imagesx($hImage);
    list($r1,$g1,$b1) = hex2rgb($sStartColor);
    list($r2,$g2,$b2) = hex2rgb($sEndColor);
    $nOld_r = 0; $nOld_g = 0; $nOld_b = 0;
    for ( $i = 0; $i < $nRows; $i=$i+1+$nStep ) {
        $r = ( $r2 - $r1 != 0 ) ? intval( $r1 + ( $r2 - $r1 ) * ( $i / $nRows ) ): $r1;
        $g = ( $g2 - $g1 != 0 ) ? intval( $g1 + ( $g2 - $g1 ) * ( $i / $nRows ) ): $g1;
        $b = ( $b2 - $b1 != 0 ) ? intval( $b1 + ( $b2 - $b1 ) * ( $i / $nRows ) ): $b1;
        if ( "$nOld_r,$nOld_g,$nOld_b" != "$r,$g,$b") {
            $hFill = imagecolorallocate( $hImage, $r, $g, $b );
        }
        imagefilledrectangle($hImage, 0, $i, $nCols, $i+$nStep, $hFill);
        $nOld_r= $r;
        $nOld_g= $g;
        $nOld_b= $b;
    }
    header("Content-type: image/png");
    imagepng($hImage);
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   thetaiko    16 年前

    我不打算做几何图形-但是创建一个更大的图像的垂直渐变,然后旋转和裁剪它:

    ...
    $degrees = -5;
    $newImage = imagecreatetruecolor($nWidth, $nHeight);
    $rotated = imagerotate($hImage, $degrees, 0);
    imagecopy($newImage, $rotated, 0, 0, $x, $y, $width, $height)
    
        2
  •  1
  •   Volomike nbk    16 年前

    下面的代码片段比GD库运行得快得多,而且不复杂。不过,您必须为PHP安装ImageMagick扩展。

    $oImage = new Imagick();
    $oImage->newPseudoImage(1000, 400, 'gradient:#09F-#048' );
    $oImage->rotateImage(new ImagickPixel(), -3);
    $oImage->cropImage(960, 250, 25, 100);
    $oImage->setImageFormat('png');
    header( "Content-Type: image/png" );
    echo $oImage;
    
    推荐文章