代码之家  ›  专栏  ›  技术社区  ›  Simon

使用gd的背景图像透明度

  •  0
  • Simon  · 技术社区  · 17 年前

    使用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 回复  |  直到 17 年前
        1
  •  3
  •   Kane Wallmann    17 年前

    我认为你走错了方向,如果你试图让透明图像出现在颜色的顶部,那么你需要先填充然后复制图像。

    另外,如果使用透明度,则需要调用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);
    
    推荐文章