2009-07-20 76 views
0

使用GD2以純色填充透明png,這是我的代碼和結果。基本上,只要透明度開始,填充顏色就會突然停止,而不是與透明度混合。使用透明背景圖片使用GD

private function GenerateImage() 
{ 
    $original = imagecreatefrompng($this->ImagePath()); 

    $x = imagesx($original); 
    $y = imagesy($original); 

    $image = imagecreate($x,$y); 

    imagealphablending($image,false); 
    imagesavealpha($image,true); 

    imagecopyresampled($image,$original,0,0,0,0,$x,$y,$x,$y); 

    $colour = imagecolorallocate($image,$this->RGB[0],$this->RGB[1],$this->RGB[2]); 
    imagefill($image,0,0,$colour); 

    return imagepng($image,$this->GeneratedPath()); 

    imagedestroy($original); 
    imagedestroy($image); 
} 

原圖:

alt text http://far.id.au/jkf/so/blank.png

產生的圖像:

alt text http://far.id.au/jkf/so/filled.png

回答

3

我覺得你這是走錯了路,如果你想有透明圖像出現在顏色的頂部,那麼您需要先填充然後複製圖像。

此外,如果你與透明度的工作,你需要調用imagecreatetruecolor();而不是imagecreate();

private function GenerateImage() 
{ 
     $original = imagecreatefrompng($this->ImagePath()); 

     $x = imagesx($original); 
     $y = imagesy($original); 

     $image = imagecreatetruecolor($x,$y); 

     imagealphablending($image,true); 
     imagesavealpha($image,true); 

     $colour = imagecolorallocate($image,$this->RGB[0],$this->RGB[1],$this->RGB[2]); 
     imagefill($image,0,0,$colour); 

     imagecopyresampled($image,$original,0,0,0,0,$x,$y,$x,$y); 

     return imagepng($image,$this->GeneratedPath()); 

     imagedestroy($original); 
     imagedestroy($image); 
} 

如果您試圖在圖像頂部繪製紅色,則使用imagefilledrectangle()而不是imagefill()。由於某些原因,imagefill對透明膠片似乎不起作用。

// Replace 
imagefill($image,0,0,$colour); 
// With 
imagefilledrectangle($image, 0,0, $x,$y,$colour); 
+0

謝謝!我喜歡用PHP使用GD,但仍然有很多需要學習的東西。 – Simon 2009-07-20 22:47:46