使用GD的背景图像的透明度

时间:2009-07-20 07:11:40

标签: php transparency gd

使用GD2填充纯色的透明png,这是我的代码和结果。基本上,一旦透明度开始,填充颜色就会突然停止,而不是与透明度混合。

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

1 个答案:

答案 0 :(得分: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()。由于某些原因,图像填充似乎不适用于透明胶片。

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