我也遇到这种情况,
一般是对PNG格式的白色背景图添加水印就会变黑色背景

解决方案 »

  1.   

    //嵌入水印程序, 文字水印和图片水印请分别添加!!!
    function setWater($imgSrc,$Img,$Text,$TextColor,$Pos,$fontType,$Type,$fontSize)
    {
    /*
    参数说明:$imgSrc:目标图片,可带相对目录地址,
    $Img:水印图片,可带相对目录地址,支持PNG和GIF两种格式,如水印图片在执行文件目录下,可写成:/.gif
    $Text:给图片添加的水印文字
    $TextColor:水印文字的字体颜色
    $Pos:图片水印添加的位置,取值范围:0~9
    0:随机位置,在1~8之间随机选取一个位置
    1:顶部居左 2:顶部居中 3:顶部居右 4:左边居中
    5:图片中心 6:右边居中 7:底部居左 8:底部居中 9:底部居右
    $fontType:具体的字体库,可带相对目录地址
    $Type:图片添加水印的方式,img代表以图片方式,text代表以文字方式添加水印
    */
        $srcInfo = @getimagesize($imgSrc);
        $srcImg_w    = $srcInfo[0];
        $srcImg_h    = $srcInfo[1];
     
        switch ($srcInfo[2]) 
        { 
            case 1: 
                $srcim =@imagecreatefromgif($imgSrc); 
    if($srcim==false)
    echo "打开失败!";
                break; 
            case 2: 
        //header("Content-Type: image/jpeg");
                $srcim =@imagecreatefromjpeg($imgSrc); 
    //print_r("hi, i am jpg file");
    //imagejpeg($srcim);
            /*imagejpeg($srcim,"temp.jpg");
    ?> <img src="temp.jpg"> <? */

    if($srcim==false)
    echo "打开失败!";
                break; 
            case 3: 
                $srcim =@imagecreatefrompng($imgSrc); 
    if($srcim==false)
    echo "打开失败!";
                break; 
            default: 
                die("不支持的图片文件类型"); 
                exit; 
        }
        

        if(!strcmp($Type,"img"))
        {
    //print_r("</br> hello ! img");
            if(!file_exists($Img) || empty($Img))
            {
                return;
            }
                
            $ImgInfo = @getimagesize($Img);
            $Img_w    = $ImgInfo[0];
            $Img_h    = $ImgInfo[1];
                
            if($srcImg_w < $Img_w || $srcImg_h < $Img_h)
            {
                return;
            }
    //print_r("</br> the imginfo is");
            //print_r($ImgInfo[2]);
            switch ($ImgInfo[2]) 
            { 
                case 1: 
                    $im =@imagecreatefromgif($Img); 
    if($im==false)
    echo "打开失败!";
                    break; 
                case 2: 
                    $im =@imagecreatefromjpeg($Img); 
    if($im==false)
    echo "打开失败!";
                    break; 
                case 3: 
                    $im =@imagecreatefrompng($Img); 
    if($im==false)
    echo "打开失败!";
                    break; 
                default: 
                    die("不支持的水印图片文件类型"); 
                    exit; 
            }
                
            $logow = $Img_w;
            $logoh = $Img_h;
        }
            
        if(!strcmp($Type,"text"))
        {
    //print_r("</br> hello ! text");
            //$fontSize = 86;  //middle
            if(!empty($Text))
            {
    //print_r($fontType);
                if(!file_exists($fontType))
                {
    //print_r("</br> hello ! no fonttype");
                    return;
                }
            }
            else 
    {
    //print_r("</br> hello ! no text");
                return;
            }
                
        //print_r("</br> hello ! i am before imagettfbbox");
            $box = imagettfbbox($fontSize, 0, $fontType,$Text);
    //print_r("</br> hello ! i am after imagettfbbox");
            $logow = max($box[2], $box[4]) - min($box[0], $box[6]);
            $logoh = max($box[1], $box[3]) - min($box[5], $box[7]);
        }
            
        if($Pos == 0)
        {
            $Pos = rand(1, 9);
        }
            
        switch($Pos)
        {
            case 1:        
                $x = +25;
                $y = +125;
                break;
            case 2:
                $x = ($srcImg_w - $logow) / 2;
                $y = +5;
                break;
            case 3:
                $x = $srcImg_w - $logow - 135;
                $y = +115;
                break;
            case 4:
                $x = +5;
                $y = ($srcImg_h - $logoh) / 2;
                break;
            case 5:
       // print_r("</br> hello !  I AM AT 5");
                $x = ($srcImg_w - $logow) / 2;
                $y = ($srcImg_h - $logoh) / 2;
                break;
            case 6:
       // print_r("</br> hello !  I AM AT 6");
                $x = $srcImg_w - $logow - 5;
                $y = ($srcImg_h - $logoh) / 2;
                break;
            case 7:
                $x = +25;
                $y = $srcImg_h - $logoh - 115;
                break;
            case 8:
                $x = ($srcImg_w - $logow) / 2;
                $y = $srcImg_h - $logoh - 5;
                break;
            case 9:
        //print_r("</br> Hi, i am at pos  9 ");
                $x = $srcImg_w - $logow - 5;
                $y = $srcImg_h - $logoh -5;
                break;
            default: 
                die("此位置不支持"); 
                exit;
        }
         /*   print_r("</br> hello i am before imagecreatetruecolor!");
         print_r($srcImg_w);
    print_r($srcImg_h);*/
        $dst_img=@imagecreatetruecolor($srcImg_w, $srcImg_h); //建立空白背景,真彩色图片
    //$dst_img=imagecreate($srcImg_w, $srcImg_h);
    /*print_r($dst_img);
           print_r("</br> hello i am after imagecreatetruecolor!!"); */
        imagecopy ( $dst_img, $srcim, 0, 0, 0, 0, $srcImg_w, $srcImg_h);
        //print_r("</br> hello!");
        if(!strcmp($Type,"img"))
        {
            imagecopy($dst_img, $im, $x, $y, 0, 0, $logow, $logoh);
            imagedestroy($im);
        }
            
        if(!strcmp($Type,"text"))
        {
    //print_r("</br> hello ! text2");
            $rgb = explode(',', $TextColor);
            $color = imagecolorallocate($dst_img, $rgb[0], $rgb[1], $rgb[2]);
            imagettftext($dst_img, $fontSize, 0, $x, $y, $color, $fontType,$Text);
        }
           
        switch ($srcInfo[2]) 
        { 
            case 1:
                imagegif($dst_img, $imgSrc); 
                break; 
            case 2: 
        //print_r("hello!");
                imagejpeg($dst_img, $imgSrc,97);  //bool imagejpeg ( resource image [, string filename [, int quality]] ) quality 是imagejpeg独有的参数(0~100),默认是75,0是最差,文件最小,100是最佳,文件最大。
                break; 
            case 3: 
                imagepng($dst_img, $imgSrc); 
                break;
            default: 
                die("不支持的水印图片文件类型"); 
                exit; 
        }
        /*
    $ed_img="";
    switch ($srcInfo[2]) 
        { 
            case 1:
                imagegif($dst_img, $ed_img); 
                break; 
            case 2: 
        //print_r("hello!");
                imagejpeg($dst_img, $ed_img); 
                break; 
            case 3: 
                imagepng($dst_img, $ed_img); 
                break;
            default: 
                die("不支持的水印图片文件类型"); 
                exit; 
        }*/
        imagedestroy($dst_img);
        imagedestroy($srcim);
    //return  $ed_img;
    }