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透明背景图片水印的问题》

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值