2013-02-04 53 views
2

我尝试在图像顶部呈现渐变,它需要从全色透明,这是我的代码。我得到黑色的图像,如果我把更多的0开始,我得到了白色的渐变,但没有图像。输出图像为338x100像素,但如果图像较窄,则输入图像需要向右对齐。使用PHP GD库混合透明渐变图像

function hex2rgb($hex) { 
    $rgb[0] = hexdec(substr($hex, 0, 2)); 
    $rgb[1] = hexdec(substr($hex, 2, 2)); 
    $rgb[2] = hexdec(substr($hex, 4, 2)); 
    return $rgb; 
} 

function int2rgb($color) { 
    $result[] = ($color >> 16) & 0xFF; 
    $result[] = ($color >> 8) & 0xFF; 
    $result[] = $color & 0xFF; 
    return $result; 
} 

if (isset($_GET['start']) && isset($_GET['stop']) && isset($_GET['color'])) { 
    $input = imagecreatefrompng('file.png'); 
    $width = imagesx($input); 
    $output = imagecreatetruecolor(338, 100); 
    $color = hex2rgb($_GET['color']); 
    $fill = imagecolorallocate($output, $color[0], $color[1], $color[2]); 


    for ($x=0; $x<$_GET['start']; ++$x) { 
     for ($y=0; $y<100; ++$y) { 
      imagesetpixel($output, $x, $y, $fill); 
     } 
    } 
    $range = $_GET['stop']-$_GET['start']; 
    for ($x=$_GET['start']; $x<$_GET['stop']; ++$x) { 
     $alpha = round(255-($x*255/$range)); 
     $correct_x = $width < 338 ? $x+$width-338 : $x; 
     for ($y=0; $y<100; ++$y) { 
      $input_color = int2rgb(imagecolorat($input, $correct_x, $y)); 

      $new_color = imagecolorallocate($output, 
              (($color[0]-$alpha)*$input_color[0])/255, 
              (($color[1]-$alpha)*$input_color[1])/255, 
              (($color[2]-$alpha)*$input_color[2])/255); 
      imagesetpixel($output, $x, $y, $new_color); 
     } 
    } 
    if ($_GET['stop']<338) { 
     $stop = $width < 338 ? $_GET['stop']+$width-338 : $_GET['stop']; 
     imagecopy($input, $output, $stop, 0, $_GET['stop'], 0, 338-$stop, 100); 
     header('Content-Type: image/png'); 
     imagepng($output); 
    } 
} 

我运行gradient.php?start=20&stop=200&color=ff0000脚本,并得到的,而不是红色的渐变中。

enter image description here enter image description here

如何使从全彩渐变那红到全透明?因此,它看起来像这样:

enter image description here

+0

是否必须与'GD'? – Baba

+0

@Baba不,如果可以的话。 – jcubic

回答

6

,如果您使用imagecreatetruecolor它得到一个黑色的背景图像。使用imagefill可以轻松更改图像的背景。 imagecolorallocatealpha函数让你创建一个包含透明度的颜色。 127表示完全透明,0表示不透明。

它现在和我简化你的代码位:

function hex2rgb($hex) { 
    $rgb[0] = hexdec(substr($hex, 0, 2)); 
    $rgb[1] = hexdec(substr($hex, 2, 2)); 
    $rgb[2] = hexdec(substr($hex, 4, 2)); 
    return $rgb; 
} 

if (isset($_GET['start']) && isset($_GET['stop']) && isset($_GET['color'])) { 
    $color = hex2rgb($_GET['color']); 
    $range = $_GET['stop']-$_GET['start']; 

    // create input image 
    $input = imagecreatefrompng('file.png'); 


    // create output image 
    $height = imagesy($input); 
    $width = imagesx($input); 
    $output = imagecreatetruecolor($width, $height); 

    // put a transparent background on it 
    $trans_colour = imagecolorallocatealpha($output, 0, 0, 0, 127); 
    imagefill($output, 0, 0, $trans_colour); 

    // create the gradient 
    for ($x=0; $x < $width; ++$x) { 
     $alpha = $x <= $_GET['start'] ? 0 : round(min(($x - $_GET['start'])/$range, 1)*127); 
     $new_color = imagecolorallocatealpha($output, $color[0], $color[1], $color[2], $alpha); 
     imageline($output, $x, $height, $x, 0, $new_color); 
    } 

    // copy the gradient onto the input image 
    imagecopyresampled($input, $output, 0, 0, 0, 0, $width, $height, $width, $height); 

    // output the result 
    header('Content-Type: image/png'); 
    imagepng($input); 
} 
+0

棒极了。我花了一段时间才弄清楚如何在图像的另一侧(右侧)使用此透明度: '$ alpha = $ x <= $ start? 127:round(min(($ stop- $ x)/ $ range,1)* 127;' 其中$ stop等于图像的宽度。 – Linkmichiel