折雨的天空

博客介绍:本博客当前共有文章【968】篇,总阅读量【5,159,034】次,第一篇博客发表于【2011年04月06日 10时34分】,距今已【4978】天,感谢您的使用!

您的位置:折雨的天空 >php开发> png透明背景图片水印的问题

png透明背景图片水印的问题

之前在网上找了一个函数,生成水印的,支持jpg,gif,和png,但是每次在生成png图片的水印时总出错。

创建一个0字节的png文件,就失败了。后调试了下,发现是几个参数的问题

第一:生成水印后变成0字节文件。

 

原因在与代码里使用了:

 

imagepng($ground_im,$groundImage,100);
翻看了下手册,5.1.2开始,php引入了第三个参数,但是Imagepng的第三个参数只有0到9,估计是写代码的人不小心造成。

 

第二:打上水印后,png格式不再透明。

找了很多地方,别人都只说解决了,没说怎么解决的。

通过实践,在imagecopy前加两句

//设定图像的混色模式
imagealphablending($ground_im, true);
//支持PNG透明
imagesavealpha($ground_im, true);
一般第一句可能已经有了,只需要第二句了。

到此,问题解决

 

完整函数代码如下

/**
     * make_watermark()
     * 
     * @param mixed $groundImage
     * @param string $waterImage
     * @param integer $waterPos
     * @param integer $xOffset
     * @param integer $yOffset
     * @return void
     */
   function make_watermark($groundImage,$waterImage="",$waterPos=0,$xOffset=0,$yOffset=0) 
    {
        if(!empty($waterImage) && file_exists($waterImage)) 
        {
            
            $water_info = getimagesize($waterImage);
            $water_w = $water_info[0];//取得水印图片的宽
            $water_h = $water_info[1];//取得水印图片的高
            switch($water_info[2])
            { 
                //取得水印图片的格式
                case 1:
                {
                    $water_im = imagecreatefromgif($waterImage);
                    break;
                }
                case 2:
                {
                    $water_im = imagecreatefromjpeg($waterImage);
                    break;
                }
                case 3:
                {
                    $water_im = imagecreatefrompng($waterImage);
                    break;
                }
            }
        }
        //读取背景图片
        if(!empty($groundImage) && file_exists($groundImage)) 
        {
            $ground_info = getimagesize($groundImage);
            $ground_w = $ground_info[0];//取得背景图片的宽
            $ground_h = $ground_info[1];//取得背景图片的高
            
            switch($ground_info[2]) 
            { 
                //取得背景图片的格式
                case 1:
                {
                    $ground_im = imagecreatefromgif($groundImage);
                    break;
                }
                case 2:
                {
                    $ground_im = imagecreatefromjpeg($groundImage);
                    break;
                }
                case 3:
                {
                    $ground_im = imagecreatefrompng($groundImage);
                    break;
                }
            }
        }
        $w = $water_w;
        $h = $water_h;
        //水印位置
        switch($waterPos) 
        {
            case 0:
            {
                //随机
                $posX = rand(0,($ground_w - $w));
                $posY = rand(0,($ground_h - $h));
                break;
            }
            case 1:
            {
                //1为顶端居左
                $posX = 0;
                $posY = 0;
                break;
            }
            case 2:
            {
                //2为顶端居中
                $posX = ($ground_w - $w) / 2;
                $posY = 0;
                break;
            }
            case 3:
            {
                //3为顶端居右
                $posX = $ground_w - $w;
                $posY = 0;
                break;
            }
            case 4:
            {
                //4为中部居左
                $posX = 0;
                $posY = ($ground_h - $h) / 2;
                break;
            }
            case 5:
            {
                //5为中部居中
                $posX = ($ground_w - $w) / 2;
                $posY = ($ground_h - $h) / 2;
                break;
            }
            case 6:
            {
                //6为中部居右
                $posX = $ground_w - $w;
                $posY = ($ground_h - $h) / 2;
                break;
            }
            case 7:
            {
                //7为底端居左
                $posX = 0;
                $posY = $ground_h - $h;
                break;
            }
            case 8:
            {
                //8为底端居中
                $posX = ($ground_w - $w) / 2;
                $posY = $ground_h - $h;
                break;
            }
            case 9:
            {
                //9为底端居右
                $posX = $ground_w - $w;
                $posY = $ground_h - $h;
                break;
            }
            default:
            {
                //随机
                $posX = rand(0,($ground_w - $w));
                $posY = rand(0,($ground_h - $h));
                break;
            }
        }
        //设定图像的混色模式
        imagealphablending($ground_im, true);
        //支持PNG透明
        imagesavealpha($ground_im, true);
        imagecopy($ground_im, $water_im, $posX + $xOffset, $posY + $yOffset, 0, 0, $water_w,$water_h);//拷贝水印到目标文件
        @unlink($groundImage);
        switch($ground_info[2])
        {
            case 1:
            {
                imagegif($ground_im,$groundImage,100);
                break;
            }
            case 2:
            {
                imagejpeg($ground_im,$groundImage,100);
                break;
            }
            case 3:
            {
                imagepng($ground_im,$groundImage,9);
                break;
            }
        }
        //释放内存
        if(isset($water_info))
        {
            unset($water_info);
        }
        if(isset($water_im))
        {
            imagedestroy($water_im);
        }
        unset($ground_info);
        imagedestroy($ground_im);
    }

------------正 文 已 结 束, 感 谢 您 的 阅 读 (折雨的天空)--------------------

转载请注明本文标题和链接:《png透明背景图片水印的问题

奖励一下

取消

分享不易,烦请有多多打赏,如您也困难,点击右边关闭即可!

扫码支持
扫码打赏,5元,10元,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

-秒后自动关闭,如已打赏,或者不愿打赏,请点击右上角关闭图标。

发表评论

路人甲 表情
看不清楚?点图切换