2010-02-10 11 views
3

J'ai trouvé que la fonction suivante peut dessiner un dégradé vertical en PHP. Cependant, de nombreux concepteurs de sites Web aiment que leurs dégradés aient une source lumineuse en haut à gauche pour rendre le dégradé plus réaliste. Alors, comment est-ce que je change légèrement l'angle sur le gradient vertical, le faisant dans un léger gradient? Je ne veux pas l'exagérer complètement, mais juste un léger mouvement vers la droite en descendant le gradient vertical.Comment puis-je dessiner un dégradé légèrement diagonal remplir en 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); 

Répondre

1

L'extrait suivant tourne beaucoup plus vite que les bibliothèques GD et sans la complexité. Cependant, vous devez installer l'extension ImageMagick pour PHP.

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

Je ne vais pas faire la géométrie - mais créer le gradient vertical comme une image puis faites pivoter et recadrer:

... 
$degrees = -5; 
$newImage = imagecreatetruecolor($nWidth, $nHeight); 
$rotated = imagerotate($hImage, $degrees, 0); 
imagecopy($newImage, $rotated, 0, 0, $x, $y, $width, $height) 
+0

imagerotate() n'est pas là pour moi sur PHP 5.2.4. Il indique sur la page php.net pour cette fonction que c'est une des fonctions de la bibliothèque GD qui a une fuite de mémoire et n'est pas inclus avec Ubuntu (qui est ce que je cours). Vous avez une autre option? – Volomike

+0

http://www.php.net/manual/fr/function.imagerotate.php#93151 Je n'ai jamais utilisé cette fonction - mais quelqu'un a posté une autre fonction imageRotate pour résoudre ce problème qui semble assez prometteur. – thetaiko

+0

J'ai essayé beaucoup de ceux-ci et j'ai trouvé que imagerotateEquivalent() a fait l'affaire! Merci, thetaiko. – Volomike