2009-07-20 2 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

Спасибо! Мне нравится использовать GD с PHP, но у меня есть много возможностей учиться с ним. – Simon

Смежные вопросы