2009-07-20 6 views
0

En utilisant GD2 pour remplir un png transparent avec une couleur unie, voici mon code et le résultat. Fondamentalement, dès que la transparence commence, la couleur de remplissage s'arrête brusquement au lieu de se fondre dans la transparence.Transparence avec l'image de fond en utilisant 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); 
} 

Image originale:

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

image résultante:

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

Répondre

3

Je pense que vous allez à la mauvaise façon, si vous essayez d'avoir la transparence l'image apparaît au-dessus de la couleur, puis vous devez d'abord remplir, puis copier l'image.

De plus, si vous travaillez avec la transparence, vous devez appeler imagecreatetruecolor(); au lieu de 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); 
} 

Si vous essayez de dessiner le rouge sur le dessus de l'image, puis utilisez imagefilledrectangle() au lieu de imagefill(). Pour une raison quelconque, imagefill ne semble pas fonctionner correctement avec les transparents.

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

Merci! J'adore utiliser GD avec PHP mais j'ai encore beaucoup à apprendre avec. – Simon